2014-11-04 47 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