JsonConvert,JObject,JProperty

时间:2016-10-24 13:56:32

标签: c# json

我有以下代码创建NewtonSoft Jobjects

JObject o = new JObject(new JProperty("DataSources", new JArray(from p in repDatasource.DataSources select JObject( JProperty("Columns", new JArray (from q in p.columns select new JObject(new JProperty("Name", q.Name),new JProperty("Type", q.Type))))))));

生成这样的Json对象。 DataSources和列实际上是Jarrays

{
    "DataSources": [{
        "Columns": [{
            "Name": "OSHYPROJECT__ProjectStatus",
            "Type": "System.String"
        }, {
            "Name": "OSHYPROJECT__Pic",
            "Type": "System.String"
        }]
    }, {
        "Columns": [{
            "Name": "Complaint__Brand",
            "Type": "System.Int32"
        }, {
            "Name": "Complaint__Group",
            "Type": "System.Int32"
        }]
    }]
}

我想得到一个Json而不是数组正在创建这样的东西(请参阅代替数组,存在索引)

"DataSources": {
            "0": {
                "Columns": {
                    "0": {
                        "Name": "CategoryID",
                        "Type": "System.String"
                    },
                    "1": {
                        "Name": "CategoryName",
                        "Type": "System.String"
                    }
                },
                "NameInSource": "Dk"
            },
            "1": {
                "Ident": "StiDataTableSource",
                "Columns": {
                    "0": {
                        "Name": "pColumn1",
                        "Type": "System.String"
                    },
                    "1": {
                        "Name": "pColumn2",
                        "Type": "System.String"
                    }
                },
                "NameInSource": "Dk"
            }
        }

任何想法?

1 个答案:

答案 0 :(得分:1)

您需要一个字典(带有int键)而不是列表或数组。然后你可以用你想要的结构将它序列化为json。

一般来说,你可以这样做(假设dataSources是一个列表):

var myDictionary = dataSources.Select((o,idx) => new { o, idx })
                              .ToDictionary(k => k.idx, v => v.o);

var json = JsonConvert.SerializeObject(myDictionary);

当然,您的代码会有点复杂,因为您需要同时转换DataSourceColumns,但原则是相同的。

我还要补充一点,创建常规.NET对象然后序列化比直接使用JObjectJArray更容易。这些对象是低级别的,除非你需要一些非常特殊的序列化处理,否则你不应该把它们搞得一团糟。