c# - 将具有多个数据表的数据集转换为 Json

标签 c# json json.net

我想转换其中包含多个数据表的数据集。

例子如下,

数据集X有两个数据表A和B

Dataset

我想要的结果如下,

{
    "type":"A",
    "value":"100",
    "details":[
        {"name":"John", "age":"45", "gender":"M"},
        {"name":"Sebastin", "age":"34", "gender":"M"},
        {"name":"Marc", "age":"23", "gender":"M"},
        {"name":"Natalia", "age":"34", "gender":"F"}
        ]
}

目前我正在使用 Newtonsoft.Json。 Newtonsoft.Json 有可能吗? 如果不能,是否可以使用任何其他 .net Json 工具?

最佳答案

您可以通过为 DataSet 实现自定义 JsonConverter 来获取所需的 JSON,如下所示:

class CustomDataSetConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(DataSet));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        DataSet x = (DataSet)value;
        JObject jObject = new JObject();
        DataTable a = x.Tables["A"];
        foreach (DataColumn col in a.Columns)
        {
            jObject.Add(col.Caption.ToLower(), a.Rows[0][col].ToString());
        }
        JArray jArray = new JArray();
        DataTable b = x.Tables["B"];
        foreach (DataRow row in b.Rows)
        {
            JObject jo = new JObject();
            foreach (DataColumn col in b.Columns)
            {
                jo.Add(col.Caption.ToLower(), row[col].ToString());
            }
            jArray.Add(jo);
        }
        jObject.Add("details", jArray);
        jObject.WriteTo(writer);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

这是一个演示:

class Program
{
    static void Main(string[] args)
    {
        DataSet x = new DataSet();
        DataTable a = x.Tables.Add("A");
        a.Columns.Add("Type");
        a.Columns.Add("Value");
        a.Rows.Add("A", "100");
        DataTable b = x.Tables.Add("B");
        b.Columns.Add("Name");
        b.Columns.Add("Age");
        b.Columns.Add("Gender");
        b.Rows.Add("John", "45", "M");
        b.Rows.Add("Sebastian", "34", "M");
        b.Rows.Add("Marc", "23", "M");
        b.Rows.Add("Natalia", "34", "F");

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.Converters.Add(new CustomDataSetConverter());
        settings.Formatting = Formatting.Indented;

        string json = JsonConvert.SerializeObject(x, settings);
        Console.WriteLine(json);
    }
}

输出:

{
  "type": "A",
  "value": "100",
  "details": [
    {
      "name": "John",
      "age": "45",
      "gender": "M"
    },
    {
      "name": "Sebastian",
      "age": "34",
      "gender": "M"
    },
    {
      "name": "Marc",
      "age": "23",
      "gender": "M"
    },
    {
      "name": "Natalia",
      "age": "34",
      "gender": "F"
    }
  ]
}

关于c# - 将具有多个数据表的数据集转换为 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21727144/

相关文章:

c# - 制作 MS Excel 用户定义函数

java - 在 C# 中存储泛型类型引用

c# - 使用变量名数组反序列化 JSON

c# - 在中间件中序列化对 JSON 的响应的最佳方法是什么?

c# - 强制关闭文件

c# - 更改对象列表的编码

javascript - 在 React Native 中将 JSON 数据传递到下一页

json - Asp.Net Web Api 中 HttpGet 和 HttpPost 的区别

java - @ControllerAdvice 未因 Jackson 错误而触发

c# - 覆盖单个 json 对象而不是整个文件