-1

考虑以下 json 文件

{
  "test": {
    "CR": {
     "name": "Car"
    },
    "BK": {
     "name": "Bike"
    }
}

如何将匿名类型的使用与 LINQ to JSON 结合起来创建键值对

    CR Car
    BK Bike

通过使用 LINQ to JSON?

我已经尝试过像下面这样简单的开始,但它甚至没有编译

    JObject o = JObject.Parse(s);
    var pairs = o["test"].Select(x => x.Value).ToList();

更准确地说,像这个伪代码

var pairs = o["test"].Select( new { key = x => x.firstOrDefault().Name, value = x => x.Value}).ToList();
4

1 回答 1

1

与其使用变量属性名称创建运行时匿名类型,不如使用LINQ to JSON来创建重组JObject,如下所示:

var pairs = new JObject( ((JObject)o["test"])
                        .Properties()
                        .Select(p => new JProperty(p.Name, p.Value["name"])) );

或者,如果您更喜欢 a Dictionary<string, string>,您可以这样做:

var dictionary = ((JObject)o["test"]).Properties()
    .ToDictionary(p => p.Name, p => (string)p.Value["name"]);

或者一个ExpandoObject

var expando = new ExpandoObject();
foreach (var p in ((JObject)o["test"]).Properties())
{
    IDictionary<string, object> d = expando;
    d.Add(p.Name, (string)p.Value["name"]);
}

使用字典定义的属性名称创建运行时匿名类型并非易事,因为它需要生成运行时代码。如果你真的需要这个,请参阅具有字典属性的 C# 匿名对象

演示小提琴在这里

于 2020-07-06T22:52:34.190 回答