JavaScriptSerializer Десериализует массив Json другого типа

#c# #arrays #json #deserialization

Вопрос:

Я вижу, что подобные вопросы задавались и раньше. Однако все замечательные примеры, размещенные здесь, немного отличаются от моих. Кажется, я не могу найти пример с массивом Json, который выглядит так, как этот, и я попробовал по крайней мере 2 десятка примеров и каждый тип кода десериализации, который будет компилироваться, но, что бы я ни пытался, я не могу заставить это работать. Любая помощь будет признательна.

Вот мой Json, который возвращается.

 {"Value": [
    {
        "BirthSexId": 1,
        "BloodTypeVerificationPending": false,
        "CenterPatientId": "80671472",
        "DateOfBirth": "1970-02-16T00:00:00",
        "EthnicityRace": [
            1048576
        ],
        "FirstName": "Candidate",
        "HasParentRegistration": false,
        "LastName": "323820260",
        "ListingCenterCode": "HHHH",
        "ListingCenterType": "TX1",
        "ListingDateUsedByMatchUtc": "2011-01-21T19:17:26.04Z",
        "MedicalUrgencyStatusId": 4099,
        "RegistrationAddDateUtc": "2011-01-21T19:17:26.667Z",
        "RegistrationId": 681292,
        "RegistrationInactiveReasonId": 7,
        "RegistrationOrganCode": "KI",
        "Removed": false,
        "SocialSecurityNumber": "323820260",
        "VerifiedBloodTypeCode": "A"
    },
    {
        "BirthSexId": 2,
        "BloodTypeVerificationPending": false,
        "CenterPatientId": "72240245",
        "DateOfBirth": "1974-04-17T00:00:00",
        "EthnicityRace": [
            33554432
        ],
        "FirstName": "Candidate",
        "HasParentRegistration": false,
        "LastName": "322823847",
        "ListingCenterCode": "HHHH",
        "ListingCenterType": "TX1",
        "ListingDateUsedByMatchUtc": "2019-07-01T21:13:28.61Z",
        "MedicalUrgencyStatusId": 4010,
        "RegistrationAddDateUtc": "2019-07-01T21:13:28.693Z",
        "RegistrationId": 1203041,
        "RegistrationOrganCode": "KI",
        "Removed": false,
        "SocialSecurityNumber": "322823847",
        "VerifiedBloodTypeCode": "A"
    }
],
"ValidationResults": [] }
 

Вот мой класс C#

 public class UnosRegistration
{
    public Int32 BirthSexId { get; set; }
    public Boolean BloodTypeVerificationPending { get; set; }
    public String CenterPatientId { get; set; }
    public String DateOfBirth { get; set; }
    public Int32[] EthnicityRace { get; set; }
    public String FirstName { get; set; }
    public Boolean HasParentRegistration { get; set; }
    public String LastName { get; set; }
    public String ListingCenterCode { get; set; }
    public String ListingCenterType { get; set; }
    public String ListingDateUsedByMatchUtc { get; set; }
    public Int32 MedicalUrgencyStatusId { get; set; }
    public String RegistrationAddDateUtc { get; set; }
    public Int32 RegistrationId { get; set; }
    public Int32 RegistrationInactiveReasonId { get; set; }
    public String RegistrationOrganCode { get; set; }
    public Boolean Removed { get; set; }
    public String SocialSecurityNumber { get; set; }
    public String VerifiedBloodTypeCode { get; set; }
}
 

Вот мой фрагмент кода на C#

 response = (HttpWebResponse)myWebRequest.GetResponse();

dynamic responseString;

responseString = new StreamReader( response.GetResponseStream() ).ReadToEnd();

List<UnosRegistration> jsonResult = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize( responseString, typeof( List<UnosRegistration> ) );

var RegID = jsonResult.FirstOrDefault().RegistrationId;
 

Спасибо вам за вашу помощь.

Ответ №1:

Обратите внимание, что в вашем JSON есть Value ключ, содержащий массив из UnosRegistration . Указание вашему коду десериализовать a List of UnosRegistration не будет работать, так как десериализатор будет искать массив на верхнем уровне вашего JSON, а его там нет.

Для решения этой проблемы вам понадобится класс-оболочка, этот класс будет содержать List<UnosRegistration> свойство, называемое Value так:

 public class Wrapper
{
    public List<UnosRegistration> Value { get; set; }
}
 

Затем вы десериализуетесь вот так

 Wrapper jsonResult = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Wrapper>(responseString);
 

Комментарии:

1. О, Большое Вам Спасибо!