我如何将匿名类型与 LINQ 结合到 JSON?

How can i combine anonymous types with LINQ to JSON?

考虑以下 json 文件

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

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

的键值对
    CR Car
    BK Bike

通过使用 LINQ 到 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();

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

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

或者,如果您更喜欢 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"]);
}

使用字典定义的 属性 名称创建 运行 时间的匿名类型非常重要,因为它需要 运行 时间代码生成。如果您真的需要这个,请参阅

演示 fiddle here.