2016-02-18 4 views
1

У меня есть JSON, который я хочу сгладить в список <> объект. Я использую JsonConvert от Newtonsoft, и я настроил свои публичные классы для поддержки списка. Это следующие.Deserializing JSON Object в список C#

 public class NewDocumentObject 
    { 
     public int ContractId { get; set; } 
     public int FolderId { get; set; } 
     public string CreatedAt { get; set; } 
     public string CreatedBy { get; set; } 
     public string TemplateReference { get; set; } 
     public bool IsTest { get; set; } 
     public bool IsExplicitName { get; set; } 
     public object Requester { get; set; } 
     public object ExternalReference { get; set; } 
     public object ExternalLabel { get; set; } 
     public string Status { get; set; } 
     public string StatusLabel { get; set; } 
     public int Share { get; set; } 
     public int EffectiveRight { get; set; } 
     public string Name { get; set; } 
     public object ModifiedAt { get; set; } 
     public object ModifiedBy { get; set; } 
     public object ModifiedById { get; set; } 
     public object ProfileReference { get; set; } 
     public object ESignatureId { get; set; } 
     public List<object> Documents { get; set; } 
     public object Folder { get; set; } 
     public object Session { get; set; } 
     public string ESignatureStatus { get; set; } 
     public List<object> Alerts { get; set; } 
     public List<Link> Links { get; set; } 
    } 

    public class Link 
    { 
     public string rel { get; set; } 
     public string method { get; set; } 
     public string href { get; set; } 
    } 

JSON выглядит следующим образом.

{ 
"ContractId": 103, 
"FolderId": 6, 
"CreatedAt": "2016-02-18T11:30:17.293", 
"CreatedBy": "SMTC", 
"TemplateReference": "Non Disclosure Agreement", 
"IsTest": false, 
"IsExplicitName": false, 
"Requester": null, 
"ExternalReference": null, 
"ExternalLabel": null, 
"Status": "Incomplete", 
"StatusLabel": "Incomplete", 
"Share": 0, 
"EffectiveRight": 3, 
"Name": "Non Disclosure Agreement", 
"ModifiedAt": null, 
"ModifiedBy": null, 
"ModifiedById": null, 
"ProfileReference": null, 
"ESignatureId": null, 
"Documents": [], 
"Folder": null, 
"Session": null, 
"ESignatureStatus": "", 
"Alerts": [], 
"Links": [{ 
    "rel": "questionnaire", 
    "method": "get", 
    "href": "http://srv-dev-29/api/contracts/103/questionnaire/pages/1?navigate=first" 
}, { 
    "rel": "answers", 
    "method": "get", 
    "href": "http://srv-dev-29/api/contracts/103/answers" 
}, { 
    "rel": "documents", 
    "method": "get", 
    "href": "http://srv-dev-29/api/contracts/103/documents" 
}, { 
    "rel": "template", 
    "method": "get", 
    "href": "http://srv-dev-29/api/templates/Non Disclosure Agreement" 
}, { 
    "rel": "folder", 
    "method": "get", 
    "href": "http://srv-dev-29/api/folders/6" 
}, { 
    "rel": "self", 
    "method": "get", 
    "href": "http://srv-dev-29/api/contracts/103" 
}]} 

Для десериализации JSON у меня есть следующая строка.

List<NewDocumentObject> newDoc = JsonConvert.DeserializeObject<List<NewDocumentObject>>(response.Content.ReadAsStringAsync().Result); 

Это место, где оно падает. JsonConvertor бросает и исключает.

Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1 [ContractExpressAPITest.Form1 + NewDocumentObject]', потому что для этого типа требуется массив JSON (например [1,2,3]) для десериализации. Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип, чтобы он был обычным типом .NET (например, не примитивным типом типа integer, а не типом коллекции как массив или список), которые можно десериализовать из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализовать объект JSON. Путь «ContractId», строка 1, позиция 14.

Я подозреваю, что это связано с тем, что он не может обрабатывать элементы списка в JSON.

Любой, кто может помочь?

Благодаря

ответ

1

Вы пытаетесь десериализации в список

List<NewDocumentObject> newDoc = JsonConvert.DeserializeObject<List<NewDocumentObject>>(response.Content.ReadAsStringAsync().Result); 

Но ваша строка JSON содержит только объект {}.

Измените свой вход JSON на [{...}] Или замените свой десериализованный вызов только на один объект.

+0

Я добавил квадратные скобки к JSON, но он все равно бросает ту же ошибку. Я подозреваю, что я немного толстый. У меня есть другой список <> для некоторых JSON, которые работают отлично. Это список из 7 объектов. Однако это всего лишь 1 элемент со списком ссылок. – smitchelluk

+0

На самом деле игнорируйте меня, квадратные скобки работают отлично. smitchelluk

+0

«Или измените свой десериализованный вызов только на один объект». Как мы можем это сделать ? – shomaail

0

Вы не можете сериализовать или десериализации список <object>. Вы должны использовать строго типизированный класс.

2

Скопируйте свой JSON в буфер обмена, а затем, если вы используете Visual Studio в разделе «Редактировать> Специальная вставка> Вставить JSON в качестве классов». а затем выполните то же самое

+0

Вот как я сгенерировал свои занятия в первую очередь. – smitchelluk

+4

Вау, я не знал, что эта функция существует! Это очень поможет мне при разборе JSONs, спасибо! – Pipe