如何将以下数据从DataTable转换为JSON对象

时间:2018-01-07 13:01:40

标签: c# asp.net json linq

目前,我使用以下格式从数据库获取数据,我将其存储在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"}] 
}

我已编辑过上述格式。你能帮助我获得理想的结果吗?

2 个答案:

答案 0 :(得分:1)

您可以通过将DataTable转换为Dictionary<string, string []>,然后使用支持将字典格式化为JSON对象的JSON序列化程序将其序列化,并将字典键映射到JSON属性名称。 支持开箱即用;如果设置

,.Net 4.5及更高版本中的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();

工作演示:https://dotnetfiddle.net/smb9oW