目前,我使用以下格式从数据库获取数据,我将其存储在DataTable中。
Block HouseNo ResidentId
A 101 1
A 102 2
A 103 3
B 101 4
B 102 5
B 104 6
我想以下列格式将其转换为JSON对象。
{
"Block A" : [{1:"101"},{2:"102"},{3:"103"}],
"Block B" : [{4:"101"},{5:"102"},{6:"104"}]
}
我已编辑过上述格式。你能帮助我获得理想的结果吗?
答案 0 :(得分:1)
您可以通过将DataTable
转换为Dictionary<string, string []>
,然后使用支持将字典格式化为JSON对象的JSON序列化程序将其序列化,并将字典键映射到JSON属性名称。 json.net和javascriptserializer支持开箱即用;如果设置datacontractjsonserializer。
UseSimpleDictionaryFormat = true
也是如此
可以使用Linq将数据表转换为字典,如下所示,之后可以直接序列化字典:
// Choose the property name and value keys.
var propertyKey = "Block";
var valuesKey = "HouseNo";
// Generate the Dictionary<string, string []>
var dictionary = dataTable.AsEnumerable()
// Generate a grouping of all houses for each block
.GroupBy(r => r.Field<string>(propertyKey), r => r.Field<string>(valuesKey))
// And convert to a dictionary of names and array values for JSON serialization.
.ToDictionary(g => propertyKey + " " + g.Key, g => g.ToArray());
// Now serialize to JSON with your preferred serializer. Mine is Json.NET
var json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);
产生以下JSON:
{
"Block A": [
"101",
"102",
"103"
],
"Block B": [
"101",
"102",
"104"
]
}
注意:
请务必使用名称空间using System.Data;
并添加对System.Data.DataSetExtensions.dll
的引用,因为我正在使用某些扩展方法。
我不知道任何JSON序列化程序将IEnumerable<IGrouping<TKey, TElement>>
返回的GroupBy()
格式化为JSON对象,其中组键映射到属性名称,这就是为什么需要生成一个来自中间分组表示的最终字典表示。
示例工作.Net fiddle。
答案 1 :(得分:1)
实现所需结果的一种方法是使用Json.Net的LINQ-to-JSON API。以下是您将如何做到这一点:
// Create a new JObject by grouping the data table rows by block and then
// selecting the groups into JProperties where the block is the property name
// and the property value is a JArray containing JObjects with the resident IDs
// and corresponding house numbers in the group making up the properties of those.
var obj = new JObject(
table.Rows.Cast<DataRow>()
.GroupBy(r => r["Block"])
.Select(g => new JProperty("Block " + g.Key,
new JArray(g.Select(r =>
new JObject(
new JProperty(r["ResidentId"].ToString(), r["HouseNo"])
)
))
))
);
// Convert the JObject to a JSON string
var json = obj.ToString();