Преобразование строки JSON в DataTable

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

Я пытаюсь преобразовать строку JSON в DataTable или любую другую форму, с которой я могу работать на С#.

Вот пример файла JSON, который я получаю:

{ "DatabaseName" : {"Employees": [{"Full-Name":"John Smith","Address":["123 Main St", "Apt 202"],"City":"NYC"}]}}

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

Object jObject = JsonConvert.DeserializeObject<JObject>(Response.Content);
DataTable dsResult = JsonConvert.DeserializeObject<DataTable>(jObject.ToString());

Дает мне:

Неожиданный токен JSON при чтении DataTable. Ожидал StartArray, получил StartObject. Путь '', строка 1, позиция 1.

Любая помощь будет оценена по достоинству.

Я также использовал JSON 2 С# для создания класса и пытался преобразовать его с помощью

JsonConvert.DeserializeObject<Employees>(Response.Content);

Однако классы не позволяют мне создать переменную public string Full-Name, так как я не могу использовать - при создании переменной.

Есть ли обходной путь для этого?


person user130622    schedule 10.04.2015    source источник
comment
возможный дубликат Преобразовать JSON в DataTable   -  person Ňɏssa Pøngjǣrdenlarp    schedule 10.04.2015
comment
Вы не должны преобразовывать его в DataTable, вы должны преобразовать его в объект модели (простой класс). Чтобы понять, какой должна быть структура класса, мне нравится http://json2csharp.com/.   -  person mason    schedule 10.04.2015
comment
При этом я получаю следующую ошибку: Невозможно десериализовать текущий объект JSON (например, {имя:значение}) в тип «System.Collections.Generic.List`1[ProDataSet]», поскольку для этого типа требуется массив JSON (например, [ 1,2,3]) для правильной десериализации. Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип, чтобы он был обычным типом .NET.   -  person user130622    schedule 10.04.2015
comment
@user130622 user130622 Вы должны убедиться, что десериализуете в правильный класс.   -  person mason    schedule 10.04.2015


Ответы (2)


Что JSON недействителен, используйте это, чтобы проверить: http://jsonlint.com/

должно быть что-то вроде

{
    "DatabaseName": "Employees",
    "Rows": [
        {
            "FullName": "John Smith",
            "Address": [
                "123 Main St",
                "Apt 202"
            ],
            "City": "NYC"
        }
    ]
}
person NeonBoxx    schedule 10.04.2015
comment
Исправлена ​​строка JSON в этом примере. Я пропустил открывающую скобку при вводе строки json здесь. Но строка является допустимым json. - person user130622; 10.04.2015
comment
вы можете десериализовать это в Dictionary‹string, Object› - person NeonBoxx; 10.04.2015
comment
В преобразованном классе из json2csharp вы можете украсить свойство fullname этим атрибутом: [Newtonsoft.Json.JsonProperty(PropertyName="Full-Name")] public string FullName { get; set; } - person NeonBoxx; 10.04.2015
comment
Это помогло мне! Спасибо - person user130622; 10.04.2015

Используйте Json 2 C#, чтобы создать свой класс, и, как сказал @Plutonix, посмотрите здесь для таблицы данных.

person C1rdec    schedule 10.04.2015
comment
Я расширил вопрос. Json 2 С# дает мне __invalid имя для большинства общедоступных переменных, созданных в классе, поскольку они содержат тире. Есть ли в этом хитрость? - person user130622; 10.04.2015
comment
Исправьте свой json-взгляд на ответ @NeonBoxx - person C1rdec; 10.04.2015
comment
Строка json, которую я получаю от службы, верна, но забыл поставить открывающую скобку при написании вопроса. - person user130622; 10.04.2015
comment
Итак, теперь, когда у вас есть свой класс, вы можете начать заполнять свою таблицу данных. - person C1rdec; 10.04.2015