尝试使用模型反序列化json时出现问题

问题描述

我正在尝试反序列化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重命名为更具描述性的内容。