如何使用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,
“标签”: