.NET MVC не удается десериализовать JSON

#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