C# 使用JSON.Net将具有唯一字符串的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;

假设我有一个JSON示例:

"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,如他的回答中所述