2015-01-06 4 views
0

Я пытаюсь преобразовать json, который я десериализовал в класс, к datatable, используя приведенный ниже код, однако приведенный ниже код не работает на последней строке.Преобразовать десериализованный класс json в datatable

using (var webClient = new System.Net.WebClient()) 
{ 
    var downloadTable = webClient.DownloadString(url); 
    var myTable = JsonConvert.DeserializeObject<leagueTable>(downloadTable); 
    DataTable dt = myTable; 
} 

Я знаю, что я мог десериализован непосредственно к DataTable, но я хочу, чтобы десериализации его к классу первой, так что я могу манипулировать данные и пусть структура данных известна другим, которые используют код.

JSON вложен и классы, сделанные для него ниже

public class leagueTable 
{ 
    public string leaguename { get; set; } 
    public int gameday { get; set; } 
    public System.Collections.ObjectModel.Collection<Ranking> ranking { get; set; } 
} 

public class Ranking 
{ 
    public int rank { get; set; } 
    public string club { get; set; } 
    public int games { get; set; } 
    public int points { get; set; } 
} 
+1

Действительно ли 'leagueTable' наследуется от' DataTable'? Или какой-то тип коллекции? –

+1

Итак, ваш вопрос * «как я могу конвертировать любой объект в datatable» *? –

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

0

Для того чтобы ваша строка json была десериализована в DataTable, она должна быть массивом json-объектов, где каждый объект первого уровня в массиве соответствует строке. Например, это будет работать нормально:

string data = "[{\"FirstName\": \"John\", \"LastName\": \"Smith\"}, {\"FirstName\": \"Mohammed\", \"LastName\": \"Lee\"}]"; 
var dt = JsonConvert.DeserializeObject<DataTable>(data); 

Обратите внимание, что эта вся строка JSON находится в []. Это не работает, даже если это объект json, содержащий только массив.

Если вы хотите сначала десериализовать пользовательский тип, я бы предложил вам десериализовать тот же самый json в List<T> вместо DataTable.

class Name 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

... 

var names = JsonConvert.DeserializeObject<List<Name>>(data); 

И еще есть ways to convert the list to a DataTable. Сказав это, как только вы отмените десериализацию в пользовательский тип списка, вы все равно хотите преобразовать его в DataTable? Если DataTable должен использоваться для привязки данных к элементам управления, существуют другие варианты привязки источников.

+0

Я хотел поместить его в datatable, чтобы я мог вставить его в таблицу сервера sql. есть ли лучший способ сделать это? Если бы вы могли отредактировать свой ответ, пожалуйста? – Nate

+0

В этом случае было бы лучше десериализовать в список вашего настраиваемого типа, а затем использовать [входной параметр типа таблицы] (http://msdn.microsoft.com/en-us/library/bb510489.aspx), чтобы отправить все данные в sproc, который вставляет эти данные в таблицу SQL Server. – sudheeshix

+0

В строке deserealize вашего кода я получаю сообщение об ошибке «Невозможно десериализовать текущий объект JSON в список типов, потому что тип требует, чтобы массив JSON десериализовался правильно». Также json вложен, и я отредактировал вопрос, чтобы показать классы, сделанные для json – Nate

0

вы пробовали иметь свой класс наследует от класса DataTable? В идеале вы сможете манипулировать данными и конечным результатом будет DataTable.

+0

Я просто попробовал это, и я больше не получаю ошибку I тоже есть, но теперь код получает ошибку во время выполнения. На линии десериализации я получаю сообщение об ошибке «Неожиданный токен JSON при чтении DataTable. Ожидаемый StartArray, получил StartObject. ' – Nate

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