我有以下代码创建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"
}
}
任何想法?
答案 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);
当然,您的代码会有点复杂,因为您需要同时转换DataSource
和Columns
,但原则是相同的。
我还要补充一点,创建常规.NET对象然后序列化比直接使用JObject
和JArray
更容易。这些对象是低级别的,除非你需要一些非常特殊的序列化处理,否则你不应该把它们搞得一团糟。