【问题标题】:How do I create JSON objects in C# where the property names are set on the fly?如何在 C# 中动态设置属性名称的 JSON 对象?
【发布时间】:2023-07-06 13:25:01
【问题描述】:

我需要返回一个作为 SQL 查询结果的 JSON 对象数组。 SQL 查询可以是任何内容,因此我需要在代码中动态创建属性名称和值。

例如“select first_name, last_name from employees”我要返回:

{ "data": 
   [{
        "first_name": "dave",
        "last_name": "thielen"
    },
    {
        "first_name": "john",
        "last_name": "smith"
    }]
}

但下一个查询可能是“从订单中选择商品、价格、税金、发货日期并希望退货:

{ "data": 
   [{
        "item": "HD TV",
        "price": "598.95"
        "tax": "59.89"
        "ship_date": "2013-08-26"
    },
    {
        "item": "Cables",
        "price": "54.67"
        "tax": "5.47"
        "ship_date": "2013-08-26"
    }]
}

如何在 C# 中构建它然后转换为 JSON?

谢谢 - 戴夫

【问题讨论】:

    标签: .net json


    【解决方案1】:

    使用匿名类型,例如(使用Json.Net),

    var json = JsonConvert.SerializeObject(
        new { 
            data = new[]{ 
                new{name="a",surname="b"},
                new{name="c",surname="d"},
            } 
        }
        );
    

    会给

    {"data":[{"name":"a","surname":"b"},{"name":"c","surname":"d"}]}
    

    编辑

    我需要 "a": "b"

    var json = JsonConvert.SerializeObject(
            new Dictionary<string, string>() {
                { "a","b" }
            }
        );
    

    输出:{"a":"b"}

    EDIT2

    还有一个有趣的

    var dict = new Dictionary<string, string>() {
        { "a","b" },
        { "c","d" }
    };
    
    var json = JsonConvert.SerializeObject(
            new { data = dict.Select(x => new[]{x}.ToDictionary(kv => kv.Key, kv => kv.Value)) }
        );
    

    输出:{"data":[{"a":"b"},{"c":"d"}]}

    【讨论】:

    • 不幸的是,这行不通。对于您的示例,我需要 "a": "b"
    • 请添加答案以创建 List> 以获取动态命名对象的数组。感谢您的解决方案。
    • @DavidThielen 我想每个人都明白了。
    【解决方案2】:

    我的建议是看看Json.NET

    还有其他几个库,但我认为这是最常用的。它有一个简单的序列化/反序列化 API。

    【讨论】:

    • 我查看了 Json.NET,但似乎没有办法做到这一点。
    最近更新 更多