CustomObject的通用JSON解析器

时间:2017-10-04 15:50:11

标签: c# .net json parsing json.net

我有一个JSON内容,如:

{
 "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>的更好方法是什么?

1 个答案:

答案 0 :(得分: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