2014-11-04 42 views
0

我有一些json数据存储在一个文本文件中(数据在https://github.com/VinceG/Auto-Cars-Makes-And-Models)。我已经通过已生成以下类存储反序列化一个没有json.net的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; } 
} 

我尝试使用下面的代码deserialise数据到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; 
     } 
    } 
} 

我用json2csharp运行JSON文件这在许多不同的项目中都是反序列化的方法,并且它从来没有引起过问题。虽然它将空值返回到vehicleList对象中。

字符串builder.ToString()看起来包含所有的数据(它显示了最后的冠军这是正确的其他的Yugo模型)我故意不使用json.net,因为它是

我只是在这个应用程序中执行json的反序列化,所以它有点矫枉过正。

我应该说,这不是一个作业项目或类似的东西

+0

http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx – 2014-11-04 17:01:27

+0

不幸的是,目标平台无法访问JavascriptSerialiser类 – Nodoid 2014-11-04 17:07:01

回答

1

JSON字符串表示一个数组,所以你需要将它反序列化到List<VehicleMake>。只需更改以下行:

var vehicleList = Deserialize<VehicleMake>(sb.ToString()); 

有:

var vehicleList = Deserialize<List<VehicleMake>>(sb.ToString()); 

你会得到车用正确的初始化值,标题和模式属性的列表。

+0

完美,谢谢:) – Nodoid 2014-11-04 17:25:31

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; } 
} 
+0

谢谢 - 它仍然返回null为vehicleList中的所有值,虽然 – Nodoid 2014-11-04 17:05:41

+0

我觉得愚蠢的不知道你现在正在铸造一个VehicleMake :) – 2014-11-05 10:31:34