问题描述
我正在尝试反序列化json(使用Newtonsoft.Json),我创建了类,但是在json代码中有一个变量,我不知道它是否已更正,或者我不知道如何反序列化。
我在行上收到一个空异常:MessageBox.Show(root.matriculations._14000.name)
private void btnImportaDados_Click(object sender,EventArgs e)
{
string getDataUrl = "https://xxx.xxx.com/api/matriculations/get.json?entity_code=14000";
try
{
using (var webClient = new System.Net.WebClient())
{
var json = webClient.DownloadString(getDataUrl);
var root = JsonConvert.DeserializeObject<Rootobject>(json);
MessageBox.Show(root.matriculations._14000.name);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
public class Rootobject
{
public Matriculations matriculations { get; set; }
}
public class Matriculations
{
public _14000 _14000 { get; set; }
}
public class _14000
{
public string entity_code { get; set; }
public string name { get; set; }
public string street { get; set; }
public string local { get; set; }
public string postal_code { get; set; }
public string sub_postal_code { get; set; }
public string phone1 { get; set; }
public object phone2 { get; set; }
public string email1 { get; set; }
public object email2 { get; set; }
public string entity_code_2 { get; set; }
public string courseaction_ref { get; set; }
public string courseaction_id { get; set; }
public string course_code { get; set; }
public string course { get; set; }
public Billingorderplan[] billingorderplans { get; set; }
}
public class Billingorderplan
{
public string id { get; set; }
public string paid { get; set; }
public string date { get; set; }
public object obs { get; set; }
public object payment_doc_num { get; set; }
public string value { get; set; }
public string description { get; set; }
public string entity_code { get; set; }
public object paid_date { get; set; }
}
网址的结果(json数据)为:
{"matriculations":{"14000":{"entity_code":"14000","name":"fabio Danilson Sivone Antonio","street":"Rua Dr. Pereira Jardim,Bl. 3 - 25 - 4 B","local":"Luanda","postal_code":"2685","sub_postal_code":"093","phone1":"923810539","phone2":null,"email1":"fabiodanilson1@hotmail.com","email2":null,"entity_code_2":"9957","courseaction_ref":"EPCE_01","courseaction_id":"1828","course_code":"EPCE","course":"Especializa\u00e7\u00e3o Avan\u00e7ada em Investiga\u00e7\u00e3o de Crime Econ\u00f3mico [E-learning]","billingorderplans":[{"id":"298","paid":"0","date":"2020-05-06","obs":null,"payment_doc_num":null,"value":"0.00","description":"Inscri\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"299","date":"2019-11-21","description":"1\u00aa presta\u00e7\u00e3o",{"id":"300","date":"2019-12-08","description":"2\u00aa presta\u00e7\u00e3o",{"id":"301","date":"2020-01-08","description":"3\u00aa presta\u00e7\u00e3o",{"id":"302","date":"2020-02-08","description":"4\u00aa presta\u00e7\u00e3o",{"id":"303","date":"2020-03-08","description":"5\u00aa presta\u00e7\u00e3o",{"id":"304","date":"2020-04-08","description":"6\u00aa presta\u00e7\u00e3o",{"id":"305","date":"2020-05-08","description":"7\u00aa presta\u00e7\u00e3o",{"id":"306","date":"2020-06-08","description":"8\u00aa presta\u00e7\u00e3o",{"id":"16595","date":"2020-08-27","value":"20.00","description":"EExt - Atividade",{"id":"16596","value":"45.00","description":"EExt - Teste",{"id":"16597",{"id":"16598",{"id":"16599",{"id":"16601",{"id":"16600","paid_date":null}]}}}
但是“ 14000”是一个可变值,取决于传递的参数。
我该怎么办?
谢谢。
解决方法
返回的JSON中没有_14000
,但在预科中却没有14000
。
由于14000不能为变量名,因此您将不得不借助一些手动干预来捕获该动态值。最干净的方法是删除Matriculations
类,然后将其替换为Dictionary<int,_14000>
(或Dictionary<string,_14000>
)。
public class Rootobject
{
public Dictionary<int,_14000> matriculations { get; set; }
}
这将确保即使是数字,也可以正确捕获键。您可以从字典的值中读取对象,例如:root.matriculations.Values.First().name
。 (请记住导入System.Linq
以使用.First()
。)
为清楚起见,您可以将_14000
重命名为更具描述性的内容。