【问题标题】:How can i combine anonymous types with LINQ to JSON?如何将匿名类型与 LINQ to JSON 结合使用?
【发布时间】:2020-07-06 19:28:56
【问题描述】:

考虑以下 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();

【问题讨论】:

  • 您应该按名称访问test 属性或转换为JProperty
  • @OlivierRogier 我不明白如何展示如何使用 JSON 可以回答这个“在运行时创建匿名类型”的问题......除非 OP 澄清他们实际想要什么去实现。
  • @OrElse 你熟悉 lambda 表达式吗?我建议你先看看它的基础知识并编译你的代码
  • @OlivierRogier 请问你为什么关闭这个问题?
  • 您可以随时使用 LINQ to JSON 在原始JObject 的基础上创建一个新的JObject,即var pairs = new JObject( ((JObject)o["test"]).Properties().Select(p => new JProperty(p.Name, p.Value["name"])) );。或者,如果您更喜欢字典,那么var dictionary = ((JObject)o["test"]).Properties().ToDictionary(p => p.Name, p => (string)p.Value["name"]);。见:dotnetfiddle.net/5fnn5E

标签: c# json linq json.net linq-to-json


【解决方案1】:

您可以使用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"]);
}

使用字典定义的属性名称创建运行时匿名类型并非易事,因为它需要生成运行时代码。如果你真的需要这个,请查看C# anonymous object with properties from dictionary

演示小提琴here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2020-02-19
    • 2011-05-21
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多