2016-02-27 87 views
-1

我需要一些幫助反序列化JSON這樣,尤其是API請求返回一個包含多個這樣的JSON響應:我如何反序列化這個json?

{"trace":{"details":{"[date]":"[27-02-2016 9:47:00.666970]","[level]":"[info]","[message]":"[System Done.]"},"context":[]}} 
{"trace":{"details":{"[date]":"[27-02-2016 9:47:00.677366]","[level]":"[info]","[message]":"[Trace Done.]"},"context":[[{"ID":"John Doe"}]]}} 

如何可以看到上面有在兩個JSON返回。這是實際我的課:

class Foo 
{ 
    public class Details 
    { 
     public string date { get; set; } 
     public string level { get; set; } 
     public string message { get; set; } 
    } 

    public class Trace 
    { 
     public Details details { get; set; } 
     //context? 
    } 
    public void getJson() 
    { 
     string responseText = Connection.Request("api call"); 

     var obj = JsonConvert.DeserializeObject<Details>(responseText); 
     Console.WriteLine(responseText); 
    } 
} 

變量responseText包含上述兩個JSON,我需要循環的trace每一行和反序列化,有人可以幫助我實現這一目標?

+1

'我需要遍歷每個line'不是有效的JSON,但如果是這樣,你可能會反序列化到一個數組或項目 – Plutonix

+0

的名單只是反序列化JSON的一個列表和迭代。它不能比這更簡單。 – Eminem

+2

因此,用戶在一個請求中發送兩個json對象?這實際上並不是人們應該這樣做的方式,你可以將它們作爲數組發送:像'[json1,json2]'。 –

回答

0

您缺少該行的類定義。然後你應該用行分割你的響應字符串並反序列化它們中的每一個。

using System.Linq; 
... 
class Foo 
{ 
    public class ResponseLine 
    { 
     public Trace trace { get; set; } 
    } 

    public class Context 
    { 
     public string ID { get; set; } 
    } 

    public class Details 
    { 
     public string date { get; set; } 
     public string level { get; set; } 
     public string message { get; set; } 
    } 

    public class Trace 
    { 
     public Details details { get; set; } 
     public Context[][] context { get; set; } 
    } 

    public void getJson() 
    { 
     string responseText = Connection.Request("api call"); 
     Console.WriteLine(responseText); 

     // responseText is not valid JSON, need to split it by lines 
     // before deserializing. 
     var traces = responseText.Split('\n') 
      .Where(l => !string.IsNullOrWhiteSpace(l)) 
      .Select(l => JsonConvert 
       .DeserializeObject<ResponseLine>(l)) 
      .ToList(); 
    } 
} 

我已經添加了看起來需要的context屬性。但我猜這個數組數組可能包含除您的示例中顯示的ID之外的其他屬性。

0

你可以使用Json.NET反序列化你的json結果並將其映射到你的類! Get JSON.net from here :)

+1

這是無效的文件,因爲它顯示在問題上。串行器不會這樣做。 – Everts

0

首先你將它們分開,因爲你說有不同的行,只需使用ReadAllLines來獲取一個字符串數組。然後你迭代並反序列化。你最終得到一個Details對象列表。

string[] strs = response.Split(new char[]{'\n'}); 
List<Details>list new List<Details>(); 
foreach(string str in str) 
{ 
    list.Add(JsonConvert.DeserializeObject<Details>(str)); 
} 
+1

'response'不是文件名'File.ReadAllLines(response)'=> ['NotSupportedException':* path *格式無效。](https://msdn.microsoft.com/en-us/library /s2tte0y1%28v=vs.110%29.aspx) –

+0

確實,它應該被拆分。 – Everts