Member 13621621 Ответов: 2

Проблемы десериализации json в C#


Я заранее извиняюсь, так как это, вероятно, легко исправить и будет слишком раздражать всех, кто его читает. Однако заранее спасибо за любую оказанную помощь! Я не кодировал уже много лет, однако недавние события требуют, чтобы я снова взял трубку. Я никогда не кодировал ни в чем, кроме VB6, так что для меня это всего лишь процесс обучения. Я пытаюсь использовать newtonsoft.json для десериализации строки json, возвращаемой из API White Pages Pro. Все работало идеально и десериализовалось безупречно, пока я не добрался до is_commercial. Все прошлое там, где я сталкиваюсь с проблемами. Ошибки, с которыми я сталкиваюсь, заключаются в следующем:

WhitePagesTool.jsonPersonComplex' does not contain a definition for 'Name' and no extension method 'Name' accepting a first argument of type 'WhitePagesTool.jsonPersonComplex' could be found (are you missing a using directive or an assembly reference?)


Также выдает ту же ошибку для всех следующих:
фамилия, имя, отчество, фамилия, age_range, пол, street_line_1, street_line_2, город, postal_code, state_code, код_страны, широту, долготу, точность, и associated_people

Это типичная строка Json, с которой я буду работать (измененная информация по очевидным причинам):
{
  "id": "Phone.ID.Number",
  "phone_number": "5555555555",
  "is_valid": true,
  "country_calling_code": "1",
  "line_type": "Landline",
  "carrier": "Suddenlink Communications",
  "is_prepaid": false,
  "is_commercial": false,
  "belongs_to": [
    {
      "id": "Person.ID.Number",
      "name": "John Json Doe",
      "firstname": "John",
      "middlename": "Json",
      "lastname": "Doe",
      "age_range": "30+",
      "gender": "Male",
      "type": "Person",
      "link_to_phone_start_date": "2018-01-01"
    }
  ],
  "current_addresses": [
    {
      "id": "Location.ID.Number",
      "location_type": "Address",
      "street_line_1": "123 Annoying Street",
      "street_line_2": null,
      "city": "CSharp",
      "postal_code": "12345",
      "zip4": "1234",
      "state_code": "FL",
      "country_code": "US",
      "lat_long": {
        "latitude": 12.345678,
        "longitude": -12.345678,
        "accuracy": "RoofTop"
      },
      "is_active": true,
      "delivery_point": "SingleUnit",
      "link_to_person_start_date": "2018-01-01"
    }
  ],
  "historical_addresses": [

  ],
  "associated_people": [
    {
      "id": "Person.ID.Number",
      "name": "Jane Doe",
      "firstname": "Jane",
      "middlename": null,
      "lastname": "Doe",
      "relation": "Household"
    },
    {
      "id": "Person.ID.Number",
      "name": "John J Doe",
      "firstname": "John",
      "middlename": "J",
      "lastname": "Doe",
      "relation": "Household"
    },
    {
      "id": "Person.ID.Number",
      "name": "John Json Doe",
      "firstname": "John",
      "middlename": "Json",
      "lastname": "Doe",
      "relation": "PotentialOwner"
    },
    {
      "id": "Person.ID.Number",
      "name": "Jane J Doe",
      "firstname": "Jane",
      "middlename": "J",
      "lastname": "Doe",
      "relation": "PotentialOwner"
    },
    {
      "id": "Person.ID.Number",
      "name": "Jane Json Doe",
      "firstname": "Jane",
      "middlename": "Json",
      "lastname": "Doe",
      "relation": "PotentialOwner"
    }
  ],
  "alternate_phones": [

  ],
  "error": null,
  "warnings": [

  ]
}


Это мой класс десериализации

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace WhitePagesTool
{
    class jsonPersonComplex
    {
        public string id { get; set; }
        public string phone_number { get; set; }
        public bool is_valid { get; set; }
        public string line_type { get; set; }
        public string carrier { get; set; }
        public bool is_prepaid { get; set; }
        public bool is_commercial { get; set; }
        public List<BelongsTo> belongs_to { get; set; }


        public class BelongsTo
        {
            public string name { get; set; }
            public string firstname { get; set; }
            public string middlename { get; set; }
            public string lastname { get; set; }
            public string age_range { get; set; }
            public string gender { get; set; }
            public string type { get; set; }

        }
        public class CurrentAddress
        {
            public string street_line_1 { get; set; }
            public object street_line_2 { get; set; }
            public string city { get; set; }
            public string postal_code { get; set; }
            public string state_code { get; set; }
            public string country_code { get; set; }
            public LatLong lat_long { get; set; }
        }

        public class LatLong
        {
            public double latitude { get; set; }
            public double longitude { get; set; }
            public string accuracy { get; set; }
        }

        public class AssociatedPeople
        {
            public string name { get; set; }
            public string firstname { get; set; }
            public string middlename { get; set; }
            public string lastname { get; set; }
            public string relation { get; set; }
        }

    }

}


Это весь мой код формы

using System;
using Newtonsoft.Json;
using System.Windows.Forms;

namespace WhitePagesTool
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        #region UI events

        private void cmdDeserialize_Click(object sender, EventArgs e)
        {            
            deserialiseJSON(txtInput.Text);
        }

        private void cmdClear_Click(object sender, EventArgs e)
        {
            txtDebugOutput.Text = string.Empty;
        }

        #endregion

        #region json functions

        private void deserialiseJSON(string strJSON)
        {
            try
            {
                //var jPerson = JsonConvert.DeserializeObject<dynamic>(strJSON);                         
                var jPerson = JsonConvert.DeserializeObject<jsonPersonComplex>(strJSON);

                //debugOutput("Here's Our JSON Object: " + jPerson.ToString());

                debugOutput("Phone ID: " + jPerson.id.ToString());
                debugOutput("Phone Number: " + jPerson.phone_number.ToString());
                debugOutput("Valid Number: " + jPerson.is_valid);
                debugOutput("Line Type: " + jPerson.line_type);
                debugOutput("Carrier: " + jPerson.carrier);
                debugOutput("Prepaid: " + jPerson.is_prepaid);
                debugOutput("Commercial: " + jPerson.is_commercial);

                debugOutput("Name:  " + jPerson.Name);
                debugOutput("First Name:  " + jPerson.firstname);
                debugOutput("Middle Name:  " + jPerson.middlename);
                debugOutput("Last Name:  " + jPerson.lastname);
                debugOutput("Age Range:  " + jPerson.age_range);
                debugOutput("Gender:  " + jPerson.gender);

                debugOutput("Address:  " + jPerson.street_line_1);
                debugOutput("Extended Address:  " + jPerson.street_line_2);
                debugOutput("City:  " + jPerson.city);
                debugOutput("Postal Code:  " + jPerson.postal_code);
                debugOutput("State:  " + jPerson.state_code);
                debugOutput("Country:  " + jPerson.country_code);
                debugOutput("Latitude:  " + jPerson.latitude);
                debugOutput("Longitude:  " + jPerson.longitude);
                debugOutput("Accuracy:  " + jPerson.accuracy);

                debugOutput("Associate Name:  " + jPerson.associated_people.name);
                debugOutput("Associate First Name:  " + jPerson.associated_people.firstname);
                debugOutput("Associate Middle Name:  " + jPerson.associated_people.middlename);
                debugOutput("Associate Last Name:  " + jPerson.associated_people.lastname);
                debugOutput("Associate Relationship:  " + jPerson.associated_people.relationship);

                debugOutput("Associate Name:  " + jPerson.associated_people.name);
                debugOutput("Associate First Name:  " + jPerson.associated_people.firstname);
                debugOutput("Associate Middle Name:  " + jPerson.associated_people.middlename);
                debugOutput("Associate Last Name:  " + jPerson.associated_people.lastname);
                debugOutput("Associate Relationship:  " + jPerson.associated_people.relationship);


                debugOutput("Associate Name:  " + jPerson.associated_people.name);
                debugOutput("Associate First Name:  " + jPerson.associated_people.firstname);
                debugOutput("Associate Middle Name:  " + jPerson.associated_people.middlename);
                debugOutput("Associate Last Name:  " + jPerson.associated_people.lastname);
                debugOutput("Associate Relationship:  " + jPerson.associated_people.relationship);


                debugOutput("Associate Name:  " + jPerson.associated_people.name);
                debugOutput("Associate First Name:  " + jPerson.associated_people.firstname);
                debugOutput("Associate Middle Name:  " + jPerson.associated_people.middlename);
                debugOutput("Associate Last Name:  " + jPerson.associated_people.lastname);
                debugOutput("Associate Relationship:  " + jPerson.associated_people.relationship);


                debugOutput("Associate Name:  " + jPerson.associated_people.name);
                debugOutput("Associate First Name:  " + jPerson.associated_people.firstname);
                debugOutput("Associate Middle Name:  " + jPerson.associated_people.middlename);
                debugOutput("Associate Last Name:  " + jPerson.associated_people.lastname);
                debugOutput("Associate Relationship:  " + jPerson.associated_people.relationship);


            }
            catch(Exception ex)
            {
                debugOutput("We Had A Problem: " + ex.Message.ToString());
            }
        }



        #endregion

        #region Debug Output

        private void debugOutput(string strDebugText)
        {
            try
            {
                System.Diagnostics.Debug.Write(strDebugText + Environment.NewLine);
                txtDebugOutput.Text = txtDebugOutput.Text + strDebugText + Environment.NewLine;
                txtDebugOutput.SelectionStart = txtDebugOutput.TextLength;
                txtDebugOutput.ScrollToCaret();
            }
            catch(Exception ex)
            {
                System.Diagnostics.Debug.Write(ex.Message.ToString() + Environment.NewLine);
            }
        }

        #endregion

    }
}


Что я уже пробовал:

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

2 Ответов

Рейтинг:
2

Thomas Daniels

Ваш код таков:

debugOutput("Name:  " + jPerson.Name);
Но ваше определение собственности таково:
public string name { get; set; }
Так вот в чем дело name скорее, чем Name: Идентификаторы C# чувствительны к регистру.


Рейтинг:
1

Graeme_Grant

В этой статье подробно рассказывается о том, как десериализовать JSON и какие инструменты вы можете использовать, чтобы помочь вам: Работа с JSON в C# и VB[^]

Вот код, сгенерированный компанией JSON Utils: генерация C#, VB.Net, таблица SQL, Java и PHP из JSON[^]:

namespace WhitePagesTool
{
        public class BelongsTo
        {
            [JsonProperty("id")]
            public string Id { get; set; }

            [JsonProperty("name")]
            public string Name { get; set; }

            [JsonProperty("firstname")]
            public string Firstname { get; set; }

            [JsonProperty("middlename")]
            public string Middlename { get; set; }

            [JsonProperty("lastname")]
            public string Lastname { get; set; }

            [JsonProperty("age_range")]
            public string AgeRange { get; set; }

            [JsonProperty("gender")]
            public string Gender { get; set; }

            [JsonProperty("type")]
            public string Type { get; set; }

            [JsonProperty("link_to_phone_start_date")]
            public string LinkToPhoneStartDate { get; set; }
        }

        public class LatLong
        {
            [JsonProperty("latitude")]
            public double Latitude { get; set; }

            [JsonProperty("longitude")]
            public double Longitude { get; set; }

            [JsonProperty("accuracy")]
            public string Accuracy { get; set; }
        }

        public class CurrentAddress
        {
            [JsonProperty("id")]
            public string Id { get; set; }

            [JsonProperty("location_type")]
            public string LocationType { get; set; }

            [JsonProperty("street_line_1")]
            public string StreetLine1 { get; set; }

            [JsonProperty("street_line_2")]
            public object StreetLine2 { get; set; }

            [JsonProperty("city")]
            public string City { get; set; }

            [JsonProperty("postal_code")]
            public string PostalCode { get; set; }

            [JsonProperty("zip4")]
            public string Zip4 { get; set; }

            [JsonProperty("state_code")]
            public string StateCode { get; set; }

            [JsonProperty("country_code")]
            public string CountryCode { get; set; }

            [JsonProperty("lat_long")]
            public LatLong LatLong { get; set; }

            [JsonProperty("is_active")]
            public bool IsActive { get; set; }

            [JsonProperty("delivery_point")]
            public string DeliveryPoint { get; set; }

            [JsonProperty("link_to_person_start_date")]
            public string LinkToPersonStartDate { get; set; }
        }

        public class AssociatedPeople
        {
            [JsonProperty("id")]
            public string Id { get; set; }

            [JsonProperty("name")]
            public string Name { get; set; }

            [JsonProperty("firstname")]
            public string Firstname { get; set; }

            [JsonProperty("middlename")]
            public string Middlename { get; set; }

            [JsonProperty("lastname")]
            public string Lastname { get; set; }

            [JsonProperty("relation")]
            public string Relation { get; set; }
        }

        public class jsonPersonComplex
        {
            [JsonProperty("id")]
            public string Id { get; set; }

            [JsonProperty("phone_number")]
            public string PhoneNumber { get; set; }

            [JsonProperty("is_valid")]
            public bool IsValid { get; set; }

            [JsonProperty("country_calling_code")]
            public string CountryCallingCode { get; set; }

            [JsonProperty("line_type")]
            public string LineType { get; set; }

            [JsonProperty("carrier")]
            public string Carrier { get; set; }

            [JsonProperty("is_prepaid")]
            public bool IsPrepaid { get; set; }

            [JsonProperty("is_commercial")]
            public bool IsCommercial { get; set; }

            [JsonProperty("belongs_to")]
            public IList<BelongsTo> BelongsTo { get; set; }

            [JsonProperty("current_addresses")]
            public IList<CurrentAddress> CurrentAddresses { get; set; }

            [JsonProperty("historical_addresses")]
            public IList<object> HistoricalAddresses { get; set; }

            [JsonProperty("associated_people")]
            public IList<AssociatedPeople> AssociatedPeople { get; set; }

            [JsonProperty("alternate_phones")]
            public IList<object> AlternatePhones { get; set; }

            [JsonProperty("error")]
            public object Error { get; set; }

            [JsonProperty("warnings")]
            public IList<object> Warnings { get; set; }
        }
}

Сгенерированный код сопоставляет имена свойств JSON со свойствами CamelCase C#. Это должно помочь уменьшить путаницу в вашем коде.

ОБНОВЛЕНИЕ: Добавлена поддержка типов, допускающих обнуление.
namespace WhitePagesTool
{
	public class BelongsTo
	{
		[JsonProperty("id")]
		public string Id { get; set; }

		[JsonProperty("name")]
		public string Name { get; set; }

		[JsonProperty("firstname")]
		public string Firstname { get; set; }

		[JsonProperty("middlename")]
		public string Middlename { get; set; }

		[JsonProperty("lastname")]
		public string Lastname { get; set; }

		[JsonProperty("age_range")]
		public string AgeRange { get; set; }

		[JsonProperty("gender")]
		public string Gender { get; set; }

		[JsonProperty("type")]
		public string Type { get; set; }

		[JsonProperty("link_to_phone_start_date")]
		public string LinkToPhoneStartDate { get; set; }
	}

	public class LatLong
	{
		[JsonProperty("latitude")]
		public double? Latitude { get; set; }

		[JsonProperty("longitude")]
		public double? Longitude { get; set; }

		[JsonProperty("accuracy")]
		public string Accuracy { get; set; }
	}

	public class CurrentAddress
	{
		[JsonProperty("id")]
		public string Id { get; set; }

		[JsonProperty("location_type")]
		public string LocationType { get; set; }

		[JsonProperty("street_line_1")]
		public string StreetLine1 { get; set; }

		[JsonProperty("street_line_2")]
		public string StreetLine2 { get; set; }

		[JsonProperty("city")]
		public string City { get; set; }

		[JsonProperty("postal_code")]
		public string PostalCode { get; set; }

		[JsonProperty("zip4")]
		public string Zip4 { get; set; }

		[JsonProperty("state_code")]
		public string StateCode { get; set; }

		[JsonProperty("country_code")]
		public string CountryCode { get; set; }

		[JsonProperty("lat_long")]
		public LatLong LatLong { get; set; }

		[JsonProperty("is_active")]
		public bool? IsActive { get; set; }

		[JsonProperty("delivery_point")]
		public string DeliveryPoint { get; set; }

		[JsonProperty("link_to_person_start_date")]
		public string LinkToPersonStartDate { get; set; }
	}

	public class AssociatedPeople
	{
		[JsonProperty("id")]
		public string Id { get; set; }

		[JsonProperty("name")]
		public string Name { get; set; }

		[JsonProperty("firstname")]
		public string Firstname { get; set; }

		[JsonProperty("middlename")]
		public string Middlename { get; set; }

		[JsonProperty("lastname")]
		public string Lastname { get; set; }

		[JsonProperty("relation")]
		public string Relation { get; set; }
	}

	public class jsonPersonComplex
	{
		[JsonProperty("id")]
		public string Id { get; set; }

		[JsonProperty("phone_number")]
		public string PhoneNumber { get; set; }

		[JsonProperty("is_valid")]
		public bool? IsValid { get; set; }

		[JsonProperty("country_calling_code")]
		public string CountryCallingCode { get; set; }

		[JsonProperty("line_type")]
		public string LineType { get; set; }

		[JsonProperty("carrier")]
		public string Carrier { get; set; }

		[JsonProperty("is_prepaid")]
		public bool? IsPrepaid { get; set; }

		[JsonProperty("is_commercial")]
		public bool? IsCommercial { get; set; }

		[JsonProperty("belongs_to")]
		public IList<BelongsTo> BelongsTo { get; set; }

		[JsonProperty("current_addresses")]
		public IList<CurrentAddress> CurrentAddresses { get; set; }

		//[JsonProperty("historical_addresses")]
		//public IList<object> HistoricalAddresses { get; set; }

		[JsonProperty("associated_people")]
		public IList<AssociatedPeople> AssociatedPeople { get; set; }

		//[JsonProperty("alternate_phones")]
		//public IList<object> AlternatePhones { get; set; }

		//[JsonProperty("error")]
		//public object Error { get; set; }

		//[JsonProperty("warnings")]
		//public IList<object> Warnings { get; set; }
	}
}

ЗАПИСКА: Есть некоторые свойства, в которых не было предоставлено никаких данных JSON. Я прокомментировал их, чтобы предотвратить ошибки. Вам нужно будет добавить их самостоятельно.


Karthik_Mahalingam

5

Graeme_Grant

Спасибо! :)

Member 13621621

Это все еще вызывает ошибку с любым значением, которое возвращает "null"

Graeme_Grant

Пожалуйста, обратите внимание на обновление, чтобы поддерживать типы, допускающие значение null.