C# 使用JSON.Net将具有唯一字符串的JSON对象解析为父对象
假设我有一个JSON示例:C# 使用JSON.Net将具有唯一字符串的JSON对象解析为父对象,c#,json,json.net,C#,Json,Json.net,假设我有一个JSON示例: "Test": { "KIf42N7OJIke57Dj6dkh": { "name": "test 1" }, "xsQMe4WWMu19qdULspve": { "name": "test 2" } } 我想将其解析为我拥有的自定义类的数组,如下所示: class Class1 { public string Name { get; set;
"Test": {
"KIf42N7OJIke57Dj6dkh": {
"name": "test 1"
},
"xsQMe4WWMu19qdULspve": {
"name": "test 2"
}
}
我想将其解析为我拥有的自定义类的数组,如下所示:
class Class1 {
public string Name { get; set; }
Class1(string name) {
Name = name;
}
}
如何使用Json.NET的JObject.parse解析这个问题?您可以通过这样的查询实现您的目标:
var myArray = JObject
.Parse(json)
.SelectTokens("$.Test..name")
.Values<string>()
.Select(s => new Class1(s))
.ToArray();
但这可能不是最好的方法
我个人更喜欢创建类来表示json结构,然后应用转换
void Main()
{
var json = @"{""Test"": {
""KIf42N7OJIke57Dj6dkh"": {
""name"": ""test 1""
},
""xsQMe4WWMu19qdULspve"": {
""name"": ""test 2""
}
}
}";
var root = JsonConvert.DeserializeObject<Root>(json);
var array = root.Test.Select(i => i.Value).ToArray();
array.Dump();
}
public class Root
{
public Dictionary<string, Class1> Test { get; set; }
}
public class Class1
{
public string Name { get; set; }
public Class1(string name)
{
Name = name;
}
}
首先,您的Json缺少开始/结束大括号。Json需要在测试值周围使用大括号
{
'Test':
{
'KIf42N7OJIke57Dj6dkh': {'name': 'test 1'},
'xsQMe4WWMu19qdULspve': {'name': 'test 2'}
}
}
如果原始Json中缺少它,可以将当前输入Json包装如下
var correctedJson = $"{{{inputJsonString}}}";
如果您想将Json对象解析为Class1数组,而不需要创建额外的具体数据结构和使用JPath查询,那么可以使用Json.Net证明的方法使用匿名类型。比如说,
var sampleObject = new {Test = new Dictionary<string,Class1>()};
var data = JsonConvert.DeserializeAnonymousType(correctedJson,sampleObject);
var result = data.Test.Select(x=>x.Value).ToArray();
您还可以使用JPath查询或创建具体的数据结构,如@Kalten,如他的回答中所述