2017-02-17 42 views
0

我試圖在閱讀所有類似案例後找到下面的解決方案,但我仍然錯過了最後的東西。JSON到C#對象無法輸入數據

我的JSON類:

public class Obj 
{ 
    public string imo { get; set; } 
    public string boatName { get; set; } 
    public string vesselType { get; set; } 
    public string callSign { get; set; } 
    public string mmsi { get; set; } 
    public string gpsTimeStamp { get; set; } 
    public string lat { get; set; } 
    public string lon { get; set; } 
    public string cog { get; set; } 
    public string sog { get; set; } 
    public string pollCategory { get; set; } 
    public string pollMessage { get; set; } 
} 

public class RootObject 
{ 
    public List<Obj> obj { get; set; } 
    public int objCount { get; set; } 
    public string responseMessage { get; set; } 
    public int responseCode { get; set; } 
    public bool dataTruncated { get; set; } 
} 

的代碼是:

// After previous statements and functions 
WebResponse response = request.GetResponse(); 

      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       string json = reader.ReadToEnd(); 
       Vessel vessel = new Vessel(json); 

       Console.WriteLine("imo : " + vessel.imo); 
       Console.WriteLine("boatName : " + vessel.boatName); 

// etc etc 



public class Vessel 
     { 
      public Vessel(string json) 
      { 
       JavaScriptSerializer serializer = new JavaScriptSerializer(); 
       var jsonObject = serializer.Deserialize<dynamic>(json); 
       imo = (string)jsonObject["vessel"]["imo"]; 
       boatName = (string)jsonObject["vessel"]["boatName"]; 
       vesselType = (string)jsonObject["vessel"]["vesselType"]; 
       callSign = jsonObject["vessel"]["callSign"]; 
       mmsi = (string)jsonObject["vessel"]["mmsi"]; 
       gpsTimeStamp = (string)jsonObject["vessel"]["gpsTimeStamp"]; 
       lat = (string)jsonObject["vessel"]["lat"]; 
       lon = jsonObject["vessel"]["lon"]; 
       cog = (string)jsonObject["vessel"]["cog"]; 
       sog = (string)jsonObject["vessel"]["sog"]; 
       aisr = (string)jsonObject["vessel"]["aisr"]; 
       pollMessage = jsonObject["vessel"]["pollMessage"]; 
      } 
       public string imo { get; set; } 
       public string boatName { get; set; } 
       public string vesselType { get; set; } 
       public string callSign { get; set; } 
       public string mmsi { get; set; } 
       public string gpsTimeStamp { get; set; } 
       public string lat { get; set; } 
       public string lon { get; set; } 
       public string cog { get; set; } 
       public string sog { get; set; } 
       public string aisr { get; set; } 
       public string pollMessage { get; set; } 
      } 

     public class RootObject 
     { 
      public List<Vessel> obj { get; set; } 
      public int objCount { get; set; } 
      public string responseMessage { get; set; } 
      public int responseCode { get; set; } 
      public bool dataTruncated { get; set; } 
     } 
    } 

但Console.WriteLine命令不會給任何結果。

調試後的obj顯示爲空。

編輯:

我需要以下變化:

  string json = reader.ReadToEnd(); 

      var vessel = JsonConvert.DeserializeObject<RootObject>(json); 

      Console.WriteLine("responseCode : " + vessel.responseCode); 
      Console.WriteLine("imo : " + vessel.obj[0].imo); 

和類是:

public class Obj 
    { 
     public string imo { get; set; } 
     public string boatName { get; set; } 
     public string vesselType { get; set; } 
     public string callSign { get; set; } 
     public string mmsi { get; set; } 
     public string gpsTimeStamp { get; set; } 
     public string lat { get; set; } 
     public string lon { get; set; } 
     public string cog { get; set; } 
     public string sog { get; set; } 
     public string pollCategory { get; set; } 
     public string pollMessage { get; set; } 
    } 

    public class RootObject 
    { 
     public List<Obj> obj { get; set; } 
     public int objCount { get; set; } 
     public string responseMessage { get; set; } 
     public int responseCode { get; set; } 
     public bool dataTruncated { get; set; } 
    } 

感謝http://json2csharp.com/和JSON.NET

+3

爲什麼不只是反序列化到你需要的特定類型? – NicoRiff

+0

在發佈問題之前,您應該進行一些調試。 json是空的嗎?如果不是這樣,只需將其閱讀並將其設置爲靜態字段,以便重現問題。 – FINDarkside

+1

看看[json.net](http://www.newtonsoft.com/json),並將json反序列化爲對象。 – BWA

回答

3

就你的問題發表評論,反序列化你的對象更方便的方法是使用James Newton-King的Json.NET,並且可以作爲Nuget包使用。

示例代碼:

var vessel = JsonConvert.DeserializeObject<YourType>(json); 

這消除了需要在你的領域類的構造函數。 Jon.NET既快速又高度可定製。

另一方面,一般你不應該在你的域模型中進行反序列化。我認爲這會違反單一責任原則。

+0

感謝您的回覆。不幸的是,vessel.imo仍然是空的。 – falsobuio

+0

發送一個關於你的JSON如何的pastebin/gist,沒有這個,就不可能確定問題。 –

+0

雖然你不需要Json.NET。看起來像是新的Jquery,每個人都建議使用它而不解決實際問題。 – FINDarkside

2

我不知道您正在作爲迴應的JSON。但基於你正在嘗試做的,你可以做這樣的事情:

 JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     Vessel vessel = serializer.DeserializeObject(json); 

而且,它似乎不是一個好主意類的構造函數中反序列化。只要在你的方法上做。