2017-10-04 67 views
1

我有一個JSON內容,如:通用JSON解析器CustomObject

{ 
"ABCD1":[{"gopName":"JHIKJUS"},{"gopName":"LKKJHGYT"}], 
"CBFD1":[{"gopName":"HT"},{"gopName":"OP"}] 
} 

我已創建一個自定義類,即

public class DeskGopMapper 
     { 
      public List<string> GopName { get; set; } 
      public string DeskName { get; set; } 
     } 

需要知道我們如何可以編寫自定義的解析器,這樣它應該不要緊密耦合。

試過類似:

class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var stream = File.OpenRead(@"sample.txt")) 
      using (var reader = new StreamReader(stream)) 
      { 
       var line = reader.ReadToEnd(); 
       var rawObj = JObject.Parse(line); 
       List<DeskGopMapper> map = new List<DeskGopMapper>(); 
       foreach (var obj in rawObj) 
       { 
        var m = new DeskGopMapper {DeskName = obj.Key, GopName = new List<string>()}; 

        foreach (var prop in obj.Value) 
        { 
         m.GopName.Add(prop["gopName"].ToString()); 
        } 
        map.Add(m); 
       } 
      } 
     } 
    } 

我雖然不是與解析的方式很信服。

什麼是實現解析JSON響應到List<DeskGopMapper>更好的方法?

+0

你會認爲是一個 '好' 的辦法嗎?你目前的方法有什麼問題? – gareththegeek

+0

你好加雷思,謝謝你的迴應。 –

+0

有沒有更好的方法來做到這一點?當我說得更好時,我的意思是更好的方式來處理嵌套內容表示的JSON。 –

回答

0

您可以使用Json.Net的LINQ-to-JSON API來簡化代碼:

string json = File.ReadAllText(@"sample.txt"); 

List<DeskGopMapper> map = JObject.Parse(json) 
    .Properties() 
    .Select(p => new DeskGopMapper 
    { 
     DeskName = p.Name, 
     GopName = p.Value.Children<JObject>() 
         .Select(j => (string)j["gopName"]) 
         .ToList() 
    }) 
    .ToList(); 

演示小提琴:https://dotnetfiddle.net/0d2ZzH

+0

看起來更簡單。謝謝 –