2013-05-20 2 views
1

У меня есть DataTable. Когда это сериализовать в формате JSON сФорматирование вывода Newtonsoft.Json.JsonConvert.SerializeObject (dataSet)

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)* 
    ] 
} 

мне не нужно десериализовать это обратно в таблицу или другой объект, поэтому решение «односторонний» будет работать.

Спасибо!

Update:
Я последовал совету от @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); 
+0

Почему вы хотите форматировать? Вы используете JSON для передачи данных, которые не представлены. –

+0

@Ash - Пожалуйста, прочитайте вопрос. Мне нужно уменьшить размер получаемого объекта JSON. – IMK

+0

Почему бы не преобразовать данные в эту форму до сериализации? Похож на объект с 'IEnumerable ' и 'IEnumerable >'? Аналогично, вы можете распаковать его на другом конце. – spender

ответ

1

Вы можете просто конвертировать DataTable в формат вам нужно, используя проекцию 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() 
    }) 
); 
+0

Код выше не работает, как есть, но после небольшой модификации я получил его для работы. Благодаря! – IMK

Смежные вопросы