#c# #asp.net #json #rest
#c# #asp.net #json #остальное
Вопрос:
Я использую результаты из json2csharp.com в приведенном ниже ответе на запрос GET в моей модели MVC:
{
"Id": 1111111,
"CreateLocation": "xxxxxxxxEZ-V12",
"ConstituentType": {
"Description": "Individual",
"Id": 1,
"Inactive": false,
"ConstituentGroup": {
"Description": "Individual",
"Id": 1,
"Inactive": false
}
},
"DisplayName": "xxxxxxxx xxxxxxxx",
"FirstName": "xxxxxxxx",
"Inactive": {
"Id": 1,
"Description": "Active",
"Inactive": false
},
"InactiveReason": null,
"LastActivityDate": "2016-10-16T02:32:15Z",
"LastName": "xxxxxxxx",
"MailIndicator": {
"Description": "(none)",
"Id": 3,
"Inactive": false
},
"EmarketIndicator": {
"Description": "(none)",
"Id": 3,
"Inactive": false
},
"MiddleName": "",
"NameStatus": {
"Description": " ",
"Id": 1,
"Inactive": false
},
"OriginalSource": {
"Description": "Test Test",
"Id": 4,
"Inactive": false
},
"PhoneIndicator": {
"Description": "(none)",
"Id": 3,
"Inactive": false
},
"Prefix": {
"Description": "",
"Id": -1,
"Inactive": false
},
"Gender": null,
"Suffix": {
"Description": "",
"Id": -1,
"Inactive": false
},
"Salutation": {
"BusinessTitle": null,
"CreatedDateTime": "2016-05-21T16:47:52Z",
"CreateLocation": "xxxxxxxxEZ-V12",
"Constituent": {
"Id": 8775975
},
"CreatedBy": "xxxxxxxx",
"Id": 912925,
"DefaultIndicator": true,
"EnvelopeSalutation1": "xxxxxxxx xxxxxxxx",
"EnvelopeSalutation2": "",
"Label": true,
"UpdatedDateTime": "2016-05-21T16:47:52.937Z",
"UpdatedBy": "xxxxxxxx",
"LetterSalutation": "xxxxxxxx xxxxxxxx",
"SalutationType": {
"Description": "Default",
"Id": 0,
"Inactive": false
},
"EditIndicator": true,
"IsFromAffiliation": false
},
"Address": {
"Id": 9781315,
"AffiliatedConstituent": null,
"AltSalutationType": {
"Description": "Default",
"Id": 0,
"Inactive": false
},
"AddressType": {
"Description": "Home Address",
"Id": 3,
"Inactive": false
},
"City": "Brooklyn",
"CreatedDateTime": "2016-05-21T16:47:52Z",
"CreateLocation": "xxxxxxxxEZ-V12",
"CreatedBy": "xxxxxxxx",
"Constituent": {
"Id": 8775975
},
"DeliveryPoint": "",
"EndDate": null,
"GeoArea": 35,
"Inactive": false,
"Label": true,
"UpdatedDateTime": "2016-09-21T16:00:46.497Z",
"UpdatedBy": "NCOA$STD",
"Months": "YYYYYYYYYYYY",
"NcoaAction": 3,
"NcoaSession": 9,
"PostalCode": "12121212",
"PostalCodeFormatted": "11205-2348",
"PrimaryIndicator": true,
"StartDate": null,
"State": {
"Description": "New York",
"StateCode": "NY",
"Id": 51,
"Inactive": false,
"Country": {
"Description": "USA",
"Id": 1,
"Inactive": false
}
},
"Street1": "11 Fadeaddress Ave",
"Street2": null,
"Street3": null,
"Country": {
"Description": "USA",
"Id": 1,
"Inactive": false
},
"EditIndicator": true,
"IsFromAffiliation": false
},
"ElectronicAddress": {
"Address": "test@test.edu",
"AffiliatedConstituent": null,
"AltSalutationType": null,
"CreatedDateTime": "2016-05-21T16:47:53Z",
"CreateLocation": "xxxxxxxxEZ-V12",
"CreatedBy": "xxxxxxxx",
"Constituent": {
"Id": 8775975
},
"Id": 9781317,
"ElectronicAddressType": {
"Description": "Home Email",
"Id": 1,
"Inactive": false,
"IsEmail": true
},
"EndDate": null,
"AllowHtmlFormat": true,
"Inactive": false,
"UpdatedDateTime": "2016-05-21T16:47:53.03Z",
"UpdatedBy": "xxxxxxxx",
"AllowMarketing": true,
"Months": "YYYYYYYYYYYY",
"PrimaryIndicator": true,
"StartDate": null,
"EditIndicator": true,
"IsFromAffiliation": false,
"IsEmail": true
},
"PrimaryPhoneNumbers": [
{
"Address": {
"Id": 9781315,
"AddressType": {
"Description": "Home Address",
"Id": 3,
"Inactive": false
}
},
"AllowTelemarketing": true,
"DayEveningIndicator": " ",
"Constituent": {
"Id": 8775975
},
"Id": 9781316,
"Inactive": false,
"PhoneNumber": "11111111",
"PhoneFormatted": "(917) 561-0972 ",
"PhoneSearch": "11111111",
"PhoneType": {
"Description": "Phone 1",
"Id": 1,
"Inactive": false
},
"CreatedBy": "xxxxxxxx",
"CreateLocation": "xxxxxxxxEZ-V12",
"CreatedDateTime": "2016-05-21T16:47:53Z",
"UpdatedDateTime": "2016-05-21T16:47:53.027Z",
"UpdatedBy": "xxxxxxxx",
"EditIndicator": true
}
],
"CreatedDateTime": "2015-05-23T14:03:23Z",
"CreatedBy": "xxxxxxxx",
"UpdatedDateTime": "2016-10-16T02:32:15.527Z",
"UpdatedBy": "dbo ",
"SortName": "xxxxxxxx/xxxxxxxx",
"Affiliates": [],
"ProtectionType": null
}
Но когда я пытаюсь десериализовать вывод JSON и возвращаю результаты моему представлению с
//Storing the response details recieved from web api
var json = Res.Content.ReadAsStringAsync().Resu<
//Deserializing the response recieved from web api and storing into the Employee list
EmpInfo = JsonConvert.DeserializeObject<List<Constituent>>(json);
Я получаю сообщение об ошибке Не удается десериализовать текущий объект JSON…потому что для правильной десериализации типа требуется массив JSON (например, [1,2,3]). Чтобы исправить эту ошибку, либо измените JSON на массив JSON…это может быть десериализовано из объекта JSON.
Комментарии:
1.
PrimaryPhoneNumbers
Узел, например, представляет собой массив (начинается и заканчивается на[ ]
. Если это не список или массив в вашемConstituent
классе, вы получите эту ошибку.2. Я тоже это заметил, но это часть того, что дает мне запрос GET. В модели это задано как
public List<PrimaryPhoneNumber> PrimaryPhoneNumbers { get; set; }
.3. Это должно быть нормально.
Affiliates
также является массивом. Вы получили это тоже?4. Да, и это задано как
public List<object> Affiliates { get; set; }
.
Ответ №1:
Ваш пример ответа представляет собой отдельный объект, а не массив. Я не вижу вашей реализации Component, но предполагаю, что она соответствует этому определению?
В этом случае вы должны иметь возможность десериализовать отдельный результат (а не список), используя:
EmpInfo = JsonConvert.DeserializeObject<Constituent>(json);
Комментарии:
1. Спасибо, но теперь я получаю Элемент модели, переданный в словарь, имеет тип ‘TestRest.Models. Составная часть’, но для этого словаря требуется элемент модели типа ‘System. Коллекции. Общий. IEnumerable`1[TestRest.Models. Приветствие]’.
2. Это, должно быть, происходит с кодом, который использует переменную EmpInfo (добавляет в словарь)? Вам просто нужно быть последовательным в использовании одного экземпляра или коллекции экземпляров.
3. Есть ли у вас @model List<Составная часть> в верхней части вашего представления? Вам нужно решить, отображаете ли вы отдельный элемент или список, и убедиться, что все ваши JSON, model и view отражают это.
4. Есть ли у вас @model List<Составная часть> в верхней части вашего представления? Вам нужно решить, отображаете ли вы отдельный элемент или список, и убедиться, что все ваши JSON, model и view отражают это.
5.
@model IEnumerable<TestRest.Models.Constituent>
В настоящее время у меня есть в верхней части моего представления. Означает ли это, что я ищу список, а не отдельный элемент?
Ответ №2:
var result = JsonConvert.DeserializeObject<dynamic>(JSONtext)
Комментарии:
1. Спасибо за ответ. Откуда берется JSONtext?
2. JSONText — это jsonString.. любой json будет десериализован… имя параметра не важно
3. Теперь я получаю сообщение об ошибке Не удается неявно преобразовать тип ‘Newtonsoft.Json.Linq.JObject’ в ‘System. Коллекции. Generic.List<TestRest.Models. Составная часть>’
4. Я понятия не имею, что вы делаете, но вы делаете это неправильно… Я только что протестировал свой код с вашим json, и он отлично работает. Попробуйте это в отдельном проекте.
using Newtonsoft.Json; using System using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { string objJson = @" INSERT YOUR JSON STRING HERE "; var result = JsonConvert.DeserializeObject<dynamic>(objJson); } } }
5. Спасибо, это было очень полезно, но я хотел бы сосредоточиться на использовании метода HttpClient, потому что для целей REST