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

Problem trying to deserialize a json with a model

我正在尝试反序列化 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; }
    }

url 的结果(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","paid":"0","date":"2019-11-21","obs":null,"payment_doc_num":null,"value":"0.00","description":"1\u00aa presta\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"300","paid":"0","date":"2019-12-08","obs":null,"payment_doc_num":null,"value":"0.00","description":"2\u00aa presta\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"301","paid":"0","date":"2020-01-08","obs":null,"payment_doc_num":null,"value":"0.00","description":"3\u00aa presta\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"302","paid":"0","date":"2020-02-08","obs":null,"payment_doc_num":null,"value":"0.00","description":"4\u00aa presta\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"303","paid":"0","date":"2020-03-08","obs":null,"payment_doc_num":null,"value":"0.00","description":"5\u00aa presta\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"304","paid":"0","date":"2020-04-08","obs":null,"payment_doc_num":null,"value":"0.00","description":"6\u00aa presta\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"305","paid":"0","date":"2020-05-08","obs":null,"payment_doc_num":null,"value":"0.00","description":"7\u00aa presta\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"306","paid":"0","date":"2020-06-08","obs":null,"payment_doc_num":null,"value":"0.00","description":"8\u00aa presta\u00e7\u00e3o","entity_code":"14000","paid_date":null},{"id":"16595","paid":"0","date":"2020-08-27","obs":null,"payment_doc_num":null,"value":"20.00","description":"EExt - Atividade","entity_code":"14000","paid_date":null},{"id":"16596","paid":"0","date":"2020-08-27","obs":null,"payment_doc_num":null,"value":"45.00","description":"EExt - Teste","entity_code":"14000","paid_date":null},{"id":"16597","paid":"0","date":"2020-08-27","obs":null,"payment_doc_num":null,"value":"20.00","description":"EExt - Atividade","entity_code":"14000","paid_date":null},{"id":"16598","paid":"0","date":"2020-08-27","obs":null,"payment_doc_num":null,"value":"45.00","description":"EExt - Teste","entity_code":"14000","paid_date":null},{"id":"16599","paid":"0","date":"2020-08-27","obs":null,"payment_doc_num":null,"value":"20.00","description":"EExt - Atividade","entity_code":"14000","paid_date":null},{"id":"16601","paid":"0","date":"2020-08-27","obs":null,"payment_doc_num":null,"value":"45.00","description":"EExt - Teste","entity_code":"14000","paid_date":null},{"id":"16600","paid":"0","date":"2020-08-27","obs":null,"payment_doc_num":null,"value":"20.00","description":"EExt - Atividade","entity_code":"14000","paid_date":null}]}}}

但是“14000”是一个可变值,具体取决于传递的参数。

我该怎么做?

谢谢。

你没有 _14000 返回 JSON 但 14000 在预科。

由于 14000 不能是变量名,因此您将不得不借助一些手动干预来捕获该动态值。最干净的方法是删除 Matriculations class 并将其替换为 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 重命名为更具描述性的名称。