使用Newtonsoft自定义JSON字符串输出

war*_*990 4 c# json.net

我正在尝试使用Newtonsoft JsonConverter序列化C#DataTable

代码:

JsonConvert.SerializeObject(dt); //dt is DataTable
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

[
  {
    "Name": "Tiger Nixon",
    "Position": "System Architect",
    "Address": "Edinburgh",
    "No": "5421"
  },
  {
    "Name": "Garrett Winters",
    "Position": "Accountant",
    "Address": "Tokyo",
    "No": "8422"
  }
]
Run Code Online (Sandbox Code Playgroud)

我想要的结果是:

{
  "data": [
    [
      "Tiger Nixon",
      "System Architect",
      "Edinburgh",
      "5421"
    ],
    [
      "Garrett Winters",
      "Accountant",
      "Tokyo",
      "8422"
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用Newtonsoft自定义输出?我试着写我自己的代码通过序列化数据表foreach上DataTable,但性能是白天和黑夜相比Newtonsoft.

任何帮助将不胜感激

dbc*_*dbc 6

您可以使用以下内容执行此操作JsonConverter:

public class DataTableTo2dArrayConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(DataTable).IsAssignableFrom(objectType);
    }

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var table = (DataTable)value;
        var array2d = table.AsEnumerable().Select(row => table.Columns.Cast<DataColumn>().Select(col => row[col]));
        serializer.Serialize(writer, new { data = array2d });
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它像:

        var settings = new JsonSerializerSettings();
        settings.Converters.Add(new DataTableTo2dArrayConverter());
        var json = JsonConvert.SerializeObject(dt, Formatting.Indented, settings);
Run Code Online (Sandbox Code Playgroud)

请注意,我的使用System.Data.DataTableExtensions.AsEnumerable()需要引用System.Data.DataSetExtensions.dll.