C# 不使用json.net反序列化json文本文件
我将一些json数据存储在一个文本文件中(数据位于)。我通过json2csharp运行了json文件,它生成了以下存储类C# 不使用json.net反序列化json文本文件,c#,json,C#,Json,我将一些json数据存储在一个文本文件中(数据位于)。我通过json2csharp运行了json文件,它生成了以下存储类 public class Model { public string value { get; set; } public string title { get; set; } } public class VehicleMake { public string value { get; set; } public string titl
public class Model
{
public string value { get; set; }
public string title { get; set; }
}
public class VehicleMake
{
public string value { get; set; }
public string title { get; set; }
public List<Model> models { get; set; }
}
公共类模型
{
公共字符串值{get;set;}
公共字符串标题{get;set;}
}
公共级汽车制造商
{
公共字符串值{get;set;}
公共字符串标题{get;set;}
公共列表模型{get;set;}
}
我试图使用以下代码将数据反序列化到VehicleMake类中
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("Let's deserialise!");
var sb = new StringBuilder();
using (var sr = new StreamReader("models.json"))
{
string line;
while ((line = sr.ReadLine()) != null)
sb.AppendLine(line);
}
var vehicleList = Deserialize<VehicleMake>(sb.ToString());
Console.WriteLine("Done");
}
private static T Deserialize<T>(string json)
{
T obj = Activator.CreateInstance<T>();
try
{
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serializer = new DataContractJsonSerializer(obj.GetType());
obj = (T)serializer.ReadObject(ms);
ms.Close();
return obj;
}
}
catch (Exception ex)
{
Console.WriteLine("Exception throw in Deserialize - {0}-{1}", ex.Message, ex.StackTrace);
return obj;
}
}
}
class类main类
{
公共静态void Main(字符串[]args)
{
WriteLine(“让我们反序列化吧!”);
var sb=新的StringBuilder();
使用(var sr=newstreamreader(“models.json”))
{
弦线;
而((line=sr.ReadLine())!=null)
给某人加上一行(一行);
}
var vehicleList=反序列化(sb.ToString());
控制台。写入线(“完成”);
}
私有静态T反序列化(字符串json)
{
T obj=Activator.CreateInstance();
尝试
{
使用(var ms=newmemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serializer=newdatacontractjsonserializer(obj.GetType());
obj=(T)serializer.ReadObject(ms);
Close女士();
返回obj;
}
}
捕获(例外情况除外)
{
WriteLine(“反序列化中的异常抛出-{0}-{1}”,例如Message,例如StackTrace);
返回obj;
}
}
}
我在许多不同的项目中使用过这种反序列化方法,但它从未引起过问题。尽管它在vehicleList
对象中返回null,但在这里仍然存在
string builder.ToString()看起来包含了所有的数据(它为最终的标题显示了其他Yugo模型,这是正确的)
我故意不使用json.net,因为它是我在这个应用程序中对json进行的唯一反序列化,所以有点过火
我应该说,这不是一个家庭作业或类似的项目,您需要向类和成员添加[DataContract]和[DataMember]属性。也可能[可序列化]
using System;
using System.Runtime.Serialization;
[Serializable]
[DataContract]
public class Model
{
[DataMember(Name = "value")]
public string value { get; set; }
[DataMember(Name = "title")]
public string title { get; set; }
}
[Serializable]
[DataContract]
public class VehicleMake
{
[DataMember(Name = "value")]
public string value { get; set; }
[DataMember(Name = "title")]
public string title { get; set; }
[DataMember(Name = "models")]
public List<Model> models { get; set; }
}
使用系统;
使用System.Runtime.Serialization;
[可序列化]
[数据合同]
公共类模型
{
[DataMember(Name=“value”)]
公共字符串值{get;set;}
[DataMember(Name=“title”)]
公共字符串标题{get;set;}
}
[可序列化]
[数据合同]
公共级汽车制造商
{
[DataMember(Name=“value”)]
公共字符串值{get;set;}
[DataMember(Name=“title”)]
公共字符串标题{get;set;}
[DataMember(Name=“models”)]
公共列表模型{get;set;}
}
json字符串表示数组,因此需要将其反序列化为列表。只需更改以下行:
var vehicleList = Deserialize<VehicleMake>(sb.ToString());
var vehicleList=反序列化(sb.ToString());
与:
var vehicleList=反序列化(sb.ToString());
您将获得一个具有正确初始化的值、标题和型号属性的车辆列表。不幸的是,目标平台无法访问JavascriptSerialiser类谢谢-它仍然为vehicleList中的所有值返回null,尽管我觉得很愚蠢,因为我没有注意到您正在强制转换为单个车辆Make:)
var vehicleList = Deserialize<List<VehicleMake>>(sb.ToString());