Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c#动态获取所有json元素?_C#_Arrays_Json - Fatal编程技术网

如何使用c#动态获取所有json元素?

如何使用c#动态获取所有json元素?,c#,arrays,json,C#,Arrays,Json,我有下面的json和使用c#类,我成功地反序列化了它,但是如何在不向c#类添加属性的情况下动态执行它呢 "demo": [ { "a1": 1, "a2": 32, "a3": 100, "a4": 344, "a5": 455, "data": [ { } ] } ] public class de

我有下面的
json
和使用c#类,我成功地
反序列化了它
,但是如何在不向c#类添加属性的情况下动态执行它呢

"demo": [
      {
        "a1": 1,
        "a2": 32,
        "a3": 100,
        "a4": 344,
        "a5": 455,
        "data": [
          {

          }
        ]
      }
      ]




public class demo
    {
        [JsonProperty(PropertyName = "a1")]
        public int? a1 { get; set; }
        [JsonProperty(PropertyName = "a2")]
        public int? a2 { get; set; }
        [JsonProperty(PropertyName = "a3")]
        public int? a3 { get; set; }
        [JsonProperty(PropertyName = "data")]
        public List<data> data { get; set; }
    }
“演示”:[
{
“a1”:1,
“a2”:32,
“a3”:100,
“a4”:344,
“a5”:455,
“数据”:[
{
}
]
}
]
公开课演示
{
[JsonProperty(PropertyName=“a1”)]
公共int?a1{get;set;}
[JsonProperty(PropertyName=“a2”)]
公共int?a2{get;set;}
[JsonProperty(PropertyName=“a3”)]
公共int?a3{get;set;}
[JsonProperty(PropertyName=“data”)]
公共列表数据{get;set;}
}
我可以从demo元素中获取值,但当有很多元素,比如a4、a5等,我还没有添加到类中时?我如何在不添加到类中的情况下获得所有这些值

我已经有课了,我不想修改它,怎么办 然后获得额外的元素,这是主要的挑战


Json.net库中的JToken对象非常有用,您可以访问Json对象和数组,而不需要一组复杂的域模型类。当我必须访问复杂对象图的一些孤立属性时,我会使用它。我不想为了访问几个属性而定义一大堆样板类

当您不知道json可能如何或何时更改时,JToken类型也非常有用。使类层次结构保持最新可能是非常痛苦的

这里有一个很好的例子说明了JToken的有用性:

您可能已经有了用于反序列化json的类,但仍然可以使用JToken作为属性,您希望json发生变化

对数据对象列表使用JTokens会起作用

对于您的情况:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class demo
{
    [JsonProperty(PropertyName = "a1")]
    public int? a1 { get; set; }
    [JsonProperty(PropertyName = "a2")]
    public int? a2 { get; set; }
    [JsonProperty(PropertyName = "a3")]
    public int? a3 { get; set; }
    [JsonProperty(PropertyName = "data")]
    public List<JToken> data { get; set; }
}

var json = @"{
          ""a1"": 10,
          ""a2"": 11,
          ""a3"": 13,
          ""uuid"": ""1c18f0c8-02d0-425a-8dc7-13dc6d0b46af"",
          ""data"": [
            {
              ""id"": 1,
              ""timeStamp"": ""2018-01-03T08:01:00Z"",
              ""quantity"": 200.0,
              ""tag"": ""/sometag/""
            },
            {
              ""id"": 2,
              ""timeStamp"": ""2018-01-03T08:05:00Z"",
              ""quantity"": 100.0,
              ""tag"": ""/someothertag/""
            },
            {
            ""id"": 3,
              ""name"": ""somename"",
              ""age"": 32
            }
          ]
        }";


var demo1 = JsonConvert.DeserializeObject<demo>(json);

// Let's get the timeStamp of item 2.
var timeStamp = demo1.data[1].SelectToken("timeStamp").ToObject<DateTime>();

// Let's get the age of item 3.
var age = demo1.data[2].SelectToken("age").ToObject<int>();
使用Newtonsoft.Json;
使用Newtonsoft.Json.Linq;
公开课演示
{
[JsonProperty(PropertyName=“a1”)]
公共int?a1{get;set;}
[JsonProperty(PropertyName=“a2”)]
公共int?a2{get;set;}
[JsonProperty(PropertyName=“a3”)]
公共int?a3{get;set;}
[JsonProperty(PropertyName=“data”)]
公共列表数据{get;set;}
}
var json=@”{
“a1”:10,
“a2”:11,
“a3”:13,
“uuid”:“1c18f0c8-02d0-425a-8dc7-13dc6d0b46af”,
“数据”:[
{
“id”:1,
“时间戳”:“2018-01-03T08:01:00Z”,
“数量”:200.0,
“”标记“”:“”/sometag/“”
},
{
“id”:2,
“时间戳”:“2018-01-03T08:05:00Z”,
“数量”:100.0,
“”标记“”:“”/someothertag/“”
},
{
“id”:3,
“名称”:“某物名称”,
“年龄”:32
}
]
}";
var demo1=JsonConvert.DeserializeObject(json);
//让我们获取第2项的时间戳。
var timeStamp=demo1.data[1].SelectToken(“timeStamp”).ToObject();
//让我们知道第3项的年龄。
var age=demo1.data[2]。选择标记(“年龄”).ToObject();
您还可以对整个批次使用JToken.Parse,例如

var obj1 = JToken.Parse(json);

// Get a1
var a1 = obj1.SelectToken("a1", false).ToObject<int>();

// Get uuid
var uuid = obj1.SelectToken("uuid", false).ToObject<Guid>();

// Let's get the timeStamp of item 2.
var timeStamp = obj1.SelectToken("data[1].timeStamp").ToObject<DateTime>();

// Let's get the age of item 3.
var age = obj1.SelectToken("data[2].age").ToObject<int>();
var obj1=JToken.Parse(json);
//得到a1
var a1=obj1.SelectToken(“a1”,false).ToObject();
//获取uuid
var uuid=obj1.SelectToken(“uuid”,false).ToObject();
//让我们获取第2项的时间戳。
var timeStamp=obj1.SelectToken(“数据[1].timeStamp”).ToObject();
//让我们知道第3项的年龄。
var age=obj1.SelectToken(“数据[2].age”).ToObject();
调用SelectToken方法时,可以传递参数errorWhenNoMatch,以指示当属性/值不存在时是否应引发错误。这允许您在json数据结构未知时编写一些非常健壮的代码

如果要枚举/遍历属性,可以执行以下操作:

static void TraverseProperties(JToken jtoken)
{
    foreach (var value in jtoken.Values())
    {
        if (!value.HasValues)
        {
            Console.WriteLine(value.Path + ": " + value.ToObject<string>());
        }
        else
        {
            TraverseProperties(value);
        }
    }
}

TraverseProperties(obj1);
静态无效遍历属性(JToken JToken)
{
foreach(jtoken.Values()中的var值)
{
如果(!value.HasValues)
{
WriteLine(value.Path+:“+value.ToObject());
}
其他的
{
遍历属性(值);
}
}
}
遍历属性(obj1);

Json.net库中的JToken对象非常有用,您可以访问Json对象和数组,而不需要一组复杂的域模型类。当我必须访问复杂对象图的一些孤立属性时,我会使用它。我不想为了访问几个属性而定义一大堆样板类

当您不知道json可能如何或何时更改时,JToken类型也非常有用。使类层次结构保持最新可能是非常痛苦的

这里有一个很好的例子说明了JToken的有用性:

您可能已经有了用于反序列化json的类,但仍然可以使用JToken作为属性,您希望json发生变化

对数据对象列表使用JTokens会起作用

对于您的情况:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class demo
{
    [JsonProperty(PropertyName = "a1")]
    public int? a1 { get; set; }
    [JsonProperty(PropertyName = "a2")]
    public int? a2 { get; set; }
    [JsonProperty(PropertyName = "a3")]
    public int? a3 { get; set; }
    [JsonProperty(PropertyName = "data")]
    public List<JToken> data { get; set; }
}

var json = @"{
          ""a1"": 10,
          ""a2"": 11,
          ""a3"": 13,
          ""uuid"": ""1c18f0c8-02d0-425a-8dc7-13dc6d0b46af"",
          ""data"": [
            {
              ""id"": 1,
              ""timeStamp"": ""2018-01-03T08:01:00Z"",
              ""quantity"": 200.0,
              ""tag"": ""/sometag/""
            },
            {
              ""id"": 2,
              ""timeStamp"": ""2018-01-03T08:05:00Z"",
              ""quantity"": 100.0,
              ""tag"": ""/someothertag/""
            },
            {
            ""id"": 3,
              ""name"": ""somename"",
              ""age"": 32
            }
          ]
        }";


var demo1 = JsonConvert.DeserializeObject<demo>(json);

// Let's get the timeStamp of item 2.
var timeStamp = demo1.data[1].SelectToken("timeStamp").ToObject<DateTime>();

// Let's get the age of item 3.
var age = demo1.data[2].SelectToken("age").ToObject<int>();
使用Newtonsoft.Json;
使用Newtonsoft.Json.Linq;
公开课演示
{
[JsonProperty(PropertyName=“a1”)]
公共int?a1{get;set;}
[JsonProperty(PropertyName=“a2”)]
公共int?a2{get;set;}
[JsonProperty(PropertyName=“a3”)]
公共int?a3{get;set;}
[JsonProperty(PropertyName=“data”)]
公共列表数据{get;set;}
}
var json=@”{
“a1”:10,
“a2”:11,
“a3”:13,
“uuid”:“1c18f0c8-02d0-425a-8dc7-13dc6d0b46af”,
“数据”:[
{
“id”:1,
“时间戳”:“2018-01-03T08:01:00Z”,
“数量”:200.0,
“”标记“”:“”/sometag/“”
},
{
“id”:2,
“时间戳”:“2018-01-03T08:05:00Z”,
“数量”:100.0,
“标签”: