C#Json.Net-如何反序列化包含其他对象数组的对象数组

时间:2019-03-22 11:04:41

标签: c# arrays json object

从http服务器收到的Json数据如下:

[
   {
      "token":"NlhYnzF0xqG"
   },
   [
      {
         "ts":"2019-03-21 14:06:22.123",
         "id":"CC_RTC_Second",
         "val":"22"
      },
      {
         "ts":"2019-03-21 14:06:00.096",
         "id":"CC_RTC_Minute",
         "val":"6"
      },
      {
         "ts":"2019-03-21 14:00:00.276",
         "id":"CC_RTC_Hour",
         "val":"14"
      }
   ]
]

我尝试了Newtonsoft.Json文档中介绍的一些技术,但是找不到正确的方法。我花了两天时间测试来自StackOverflow答案的解决方案,但没有成功。

在这种特殊情况下,我应该使用哪些C#类型和技术?

数据结构可能会有所不同:
属性的完整列表是:td,id,val,标志,类型,uts,nr。
它们都是字符串。
如果attrs不存在,服务器可以省略它,因此例如我只能获得ts + id。
有什么方法可以处理这样的数据吗?

2 个答案:

答案 0 :(得分:1)

First of all your json is quite complicated and its tedious job to create a class hierarchy for your json,

But one simple approach is that if you parse your JSON to JArray and then takes

  • 0th element to one class
  • And all remaining into list of another class

Then might be you can retrieve all your json data

string json = File.ReadAllText(@"Path to your json");

JArray jArray = JArray.Parse(json);

Token token = jArray[0].ToObject<Token>();
jArray.RemoveAt(0);
RandomData[] tokenData = jArray.First.ToObject<RandomData[]>();

//--------------------Print Data to Console-------------------

Console.WriteLine(token.token + "\n");

foreach (var item in tokenData)
{
    Console.WriteLine("ts: " + item.ts);
    Console.WriteLine("id: " + item.id);
    Console.WriteLine("val: " + item.val + "\n");
}

Console.ReadLine();

And classes are,

class Token
{
    public string token { get; set; }
}

class RandomData
{
    public string ts { get; set; }
    public string td { get; set; }
    public string id { get; set; }
    public string val { get; set; }
    public string flags { get; set; }
    public string type { get; set; }
    public string uts { get; set; }
    public string nr { get; set; }
}

Output:

enter image description here

上禁用Javascript操作

注意:您需要安装NewtonSoft NuGet软件包并将using Newtonsoft.Json.Linq;命名空间导入程序。

答案 1 :(得分:0)

有我的答案版本:

var strData = @"[{
         'token': 'NlhYnzF0xqG'
       },
       [{
         'ts': '2019-03-21 14:06:22.123',
         'id': 'CC_RTC_Second',
         'val': '22'
       }, {
         'ts': '2019-03-21 14:06:00.096',
         'id': 'CC_RTC_Minute',

       }, {

         'id': 'CC_RTC_Hour',
         'val': '14'
       }]
     ]";   
        var result = JsonConvert.DeserializeObject<List<JToken>>(strData);
        var tokens = result.Where( x=> x.Type == JTokenType.Object).Select(x=> x.ToObject<Token>());
        var innerData = result.Where(x => x.Type == JTokenType.Array).Select(x => x.ToObject<List<InnerData>>());

有课程:

 public class Token
        {
             public string token { set; get; }
        }
    public class InnerData
        {
            public string ts { set; get; }
            public string id { set; get; }
            public string val { set; get; }    
        }

您可以如前所述打印结果:

foreach (var token in tokens)
{
    Console.WriteLine("ts: " + token.token);
}