如何从C#DataTable返回Complex Json对象

时间:2017-10-12 16:11:06

标签: c# json datatable json.net

我们目前使用Newtonsoft.Json将数据表转换为json流。

如果我的数据表包含以下内容:

Name    Sales
Joe     10
Mary    20

然后以下代码将返回[{"Name": "Joe", "Sales":10},{"Name": "Mary", "Sales":20}],这很棒:

 string callback = JsonConvert.SerializeObject(table);
 byte[] resultBytes = Encoding.UTF8.GetBytes(callback);
 return new System.IO.MemoryStream(resultBytes);

但有时候我需要一个更复杂的json流。像这样:

{ "map": "USA", "areas":[{"Name": "Joe", "Sales":10},{"Name": "Mary", "Sales":20}]}

json现在包含一个额外的元组{ "map": "USA", "areas":和一个额外的{}

我的数据表需要包含什么才能获得这种类型的json流? C#需要看起来像什么?

2 个答案:

答案 0 :(得分:0)

您需要定义一个新类并序列化整个对象,如下所示:

// Define the class / model
public class MyNewClass {
// Case sensitive vvv to match your Json
    public string map {get; set;}
    public DataTable areas {get; set;}
    // you can have several constructor methods defined, I show the usage for each below.
    public MyNewClass() {}
    public MyNewClass(string countryMap, DataTable table) {
        map = countryMap;
        areas = table;
    }
}

用法:

// Instantiate the object from the class / model
var returnData = new MyNewClass("USA", table);
// or
var returnData2 = new MyNewClass();
returnData2.map = "USA";
returnData2.areas = table;

// Finally serialize your object
var yourJson = JsonConvert.SerializeObject(returnData);
// or
var yourJosn2 = JsonConvert.SerializeObject(returnData2);

答案 1 :(得分:0)

如果您的数据源实际上是一个数据库(看起来像是这样),那就有numerous advantages of using POCOs over DataTable.

其中之一是可以使用ORM以方便的形式轻松获取信息。例如。 EntityFramework

对于您特定的复杂示例,流程可能如下:

1)定义用于保存数据的类

  class Area 
   {
       public string Name { get; set; }
       public int Sales { get; set; }
   }

   class Map 
   {
       public string Map { get; set; }
       public List<Area> Areas { get; set; }
   }

2)填充数据库中的数据

3)使用JsonConvert.SerializeObject序列化区域。