1

私はデータテーブルを持っています。で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文字列のサイズが小さくなるようにJson.Netの設定を変更する方法はありますか? たとえば、出力を次のようにフォーマットします。

{
    "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() が出力する別の型に変換しました。level から開始する方法に注意してください。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);
4

1 に答える 1

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()
  })
);
于 2013-05-20T23:04:09.003 に答える