我有一些json数据存储在一个文本文件中(数据位于https://github.com/VinceG/Auto-Cars-Makes-And-Models)。我通过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 title { get; set; }
public List<Model> models { 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;
}
}
}
我已经在许多不同的项目中使用了这种反序列化方法,但它从未引起过任何问题。虽然它在null vehicleList
对象中返回null。
字符串builder.ToString()看起来包含所有数据(它显示最终标题的其他Yugo模型是正确的)
我故意不使用json.net,因为它是json我在这个应用程序中唯一的反序列化,所以它有点矫枉过正。
我应该说这不是一个家庭作业项目或类似的东西
答案 0 :(得分:1)
json字符串表示一个数组,因此您需要将其反序列化为List<VehicleMake>
。只需更改以下行:
var vehicleList = Deserialize<VehicleMake>(sb.ToString());
使用:
var vehicleList = Deserialize<List<VehicleMake>>(sb.ToString());
您将获得具有正确初始化值,标题和模型属性的车辆列表。
答案 1 :(得分:0)
您需要将[DataContract]和[DataMember]属性添加到您的班级和成员。也可能[Serializable]
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; }
}