格式化Newtonsoft.Json.JsonConvert.SerializeObject(dataSet)的输出

时间:2013-05-20 22:47:43

标签: c# json.net

我有一个DataTable。当它用

序列化为JSON时
Newtonsoft.Json.JsonConvert.SerializeObject(dataTable)

我得到以下格式的结果:

[
    {
        "CLICK_KEY": 6254523744,
        "WEB_SERVER_KEY": 291,
        "PREV_CLICK_KEY": 0,
        "NEXT_CLICK_KEY": 0,
        "SESSION_KEY": 214981151,
        *more key value pairs*
    },
    {
        "CLICK_KEY": 6254523745,
        "WEB_SERVER_KEY": 291,
        "PREV_CLICK_KEY": 0,
        "NEXT_CLICK_KEY": 0,
        "SESSION_KEY": 214746780
        *more key value pairs*
    },
    *many more objects (for each row)*
]

由于我有很多列和很多行,因此生成的JSON非常庞大。这主要是因为列名很长并且对每行数据都不断重复。

有没有办法更改Json.Net的设置,以便减少生成的JSON字符串的大小?例如,通过将输出格式化为:

{
    "NAMES": [
        "CLICK_KEY",
        "WEB_SERVER_KEY",
        "PREV_CLICK_KEY",
        "NEXT_CLICK_KEY",
        "SESSION_KEY",
        *more keys*
    ],
    "VALUES": [
        [6254523744, 291, 0, 0, 214981151, *more values*],
        [6254523745, 291, 0, 0, 214746780, *more values*],
        *many more arrays of values (for each row)*
    ]
}

我不需要将其反序列化为表或其他对象,因此“单向”解决方案可行。

谢谢!

更新
我听了@spender&的建议。 @TravisJ并将我的DataTable转换为另一种类型,Newtonsoft.Json.JsonConvert.SerializeObject()输出了我需要的内容。请注意我是如何从DataSet级别开始的,因此如果它包含多个DataTable,它将包含数组中的每个。

var converted = from x in dataSet.Tables.Cast<DataTable>()
                select new
                {
                  NAMES = x.Columns.Cast<DataColumn>().Select(l => l.Caption),
                  VALUES = x.Rows.Cast<DataRow>().Select(l => l.ItemArray)
                };
string jsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(converted);

1 个答案:

答案 0 :(得分:1)

您可以使用linq投影将数据表转换为您需要的格式:

Newtonsoft.Json.JsonConvert.SerializeObject(
 dataTable.Select(
  d => new {
   Names = d.Columns.Select(c => c.ColumnName).ToArray(),
   Values = d.Rows.Select(r => r.ToArray()).ToArray()
  })
);