我正在尝试使用newtonsoft.json反序列化从White Pages Pro api返回的json字符串。一切都运作良好,并且完美无序地反序列化直到我的商业。过去的一切都是我遇到问题的地方。我遇到的错误如下:
WhitePagesTool.jsonPersonComplex'不包含'Name'的定义,也没有扩展方法'Name'接受类型'WhitePagesTool.jsonPersonComplex'的第一个参数(你是否缺少using指令或汇编引用?)
以下所有错误
对以下所有内容也会抛出相同的错误: firstname,middlename,lastname,age_range,gender,street_line_1,street_line_2,city,postal_code,state_code,country_code,纬度,经度,准确度和associated_people
这是我的反序列化类
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
}
}
这是我将使用的典型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": [
]
}
答案 0 :(得分:1)
你'name'属性不在'jsonPersonComplex'类中,而是在'BelongsTo'类中。
debugOutput("Name: " + jPerson.name); //should be
debugOutput("Name: " + jPerson.belongs_to().FirstOrDefault()?.name); //sorta like this for example.
此外,您的命名约定已关闭。 Newtonsoft将自动为您命名大写,虽然小写应该有效我建议使用c#标准制作c#版本。 Newtonsoft将转换以下标准,所以没关系。
我试过这个并且有效
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; }
//Current_addresses added to address comments below.
public List<CurrentAddress> Current_addresses { 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; }
}
}
然后是逻辑......
var jPerson = JsonConvert.DeserializeObject<JsonPersonComplex>(jsonString);
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.Belongs_to.FirstOrDefault().Name); //and so on
//Street_line_1 added to address comments below
debugOutput("Name: " + jPerson.Belongs_to.FirstOrDefault().Street_line_1); //and so on