【问题标题】:Create Json dynamically in c#在 C# 中动态创建 Json
【发布时间】:2012-05-02 10:04:10
【问题描述】:

我需要通过循环遍历列来动态创建一个 Json 对象。 所以声明一个空的 json 对象,然后动态添加元素。

例如:

List<String> columns = new List<String>{"FirstName","LastName"};

var jsonObj = new {};

for(Int32 i=0;i<columns.Count();i++)
    jsonObj[col[i]]="Json" + i;

而最终的json对象应该是这样的:

jsonObj={FirstName="Json0", LastName="Json1"};

【问题讨论】:

    标签: c# asp.net json c#-4.0 json.net


    【解决方案1】:
    [TestFixture]
    public class DynamicJson
    {
        [Test]
        public void Test()
        {
            dynamic flexible = new ExpandoObject();
            flexible.Int = 3;
            flexible.String = "hi";
    
            var dictionary = (IDictionary<string, object>)flexible;
            dictionary.Add("Bool", false);
    
            var serialized = JsonConvert.SerializeObject(dictionary); // {"Int":3,"String":"hi","Bool":false}
        }
    }
    

    【讨论】:

    • Yape 这就是我正在寻找的东西,谢谢。我会尝试并与您联系
    • 是否有可能使用 ExpandoObject 方法获得类似:{ "Schools": [ {"name": "test"}, {"name": "testing"} ] } 的东西?数组名称,本例中的 Schools,应该是一个变量。
    • @ThomasTeilmann 考虑提出一个更详细的新问题。根据您的评论,我不确定您在追求什么。
    【解决方案2】:

    我找到了一个非常类似于DPeden的解决方案,虽然不需要使用IDictionary,你可以直接从ExpandoObject传递到JSON转换:

    dynamic foo = new ExpandoObject();
    foo.Bar = "something";
    foo.Test = true;
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
    

    输出变为:

    { "FirstName":"John", "LastName":"Doe", "Active":true }
    

    【讨论】:

    • 这是最简单的解决方案
    • 这不是他们所要求的。它们的属性名称存在于列表中的字符串中。您刚刚硬编码了 Bar 和 Test。
    • @n4rzul 当您很可能甚至没有尝试过时,我不明白您投反对票的原因。它仅出于演示目的进行硬编码,您可以将硬编码值替换为任何动态值。
    • 其实,@ghiscoding,我认为@n4rzul 是对的。您不能以这种方式从字符串中添加字段:dictionary.Add(myFieldName, false); 与您的解决方案。
    • @ghiscoding 请仔细阅读确切的问题。他们试图解决一个非常具体的问题,并且简单地硬编码 Bar and Test 并不能解决他们的特定问题。
    【解决方案3】:

    您应该使用JavaScriptSerializer。这可以为您将实际类型序列化为 JSON :)

    参考:http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

    编辑:像这样?

    var columns = new Dictionary<string, string>
                {
                    { "FirstName", "Mathew"},
                    { "Surname", "Thompson"},
                    { "Gender", "Male"},
                    { "SerializeMe", "GoOnThen"}
                };
    
    var jsSerializer = new JavaScriptSerializer();
    
    var serialized = jsSerializer.Serialize(columns);
    

    输出:

    {"FirstName":"Mathew","Surname":"Thompson","Gender":"Male","SerializeMe":"GoOnThen"}
    

    【讨论】:

    • 我不知道 json.net,你有链接吗?我过去曾使用 JavaScriptSerializer 进行序列化和反序列化,它总是对我有用:)
    • Oded 因为它在 .Net 框架中可用。无需第三方 DLL。
    • @SpencerRuport - 并非 BCL 附带的所有东西都是最好的。
    • @Oded 我怀疑这是错误标记的情况:)。 json.net 到底提供了什么 JavaScriptSerializer 没有的?只要有好处,我对使用 3rd 方工具没有任何问题。对于甚至不确定如何构建 JSON 字符串的人,我认为内置的 .NET 行为应该绰绰有余:)
    • @FarrukhSubhani 是的,可以放入函数中,序列化变量的数据类型是字符串,参考这里查看:msdn.microsoft.com/en-us/library/…
    【解决方案4】:

    使用dynamicJObject

    dynamic product = new JObject();
    product.ProductName = "Elbow Grease";
    product.Enabled = true;
    product.StockCount = 9000;
    
    Console.WriteLine(product.ToString());
    // {
    //   "ProductName": "Elbow Grease",
    //   "Enabled": true,
    //   "StockCount": 9000
    // }
    

    或者怎么样:

    JObject obj = JObject.FromObject(new
    {
        ProductName = "Elbow Grease",
        Enabled = true,
        StockCount = 9000
    });
    
    Console.WriteLine(obj.ToString());
    // {
    //   "ProductName": "Elbow Grease",
    //   "Enabled": true,
    //   "StockCount": 9000
    // }
    

    https://www.newtonsoft.com/json/help/html/CreateJsonDynamic.htm

    【讨论】:

    • 这不是他们要求的。它们的属性名称以字符串形式存在于列表中。您的属性是硬编码的。
    猜你喜欢
    • 2019-10-21
    • 2021-11-22
    • 2015-12-25
    • 2020-12-05
    • 2018-05-08
    • 1970-01-01
    • 2016-07-28
    • 2013-04-09
    • 2010-12-22
    相关资源
    最近更新 更多