首页 > 解决方案 > JsonDeserialize 为某些字符串返回 null(仅对某些字符串)

问题描述

我正在尝试将一个相当大的 Json 反序列化为我制作的 C# 类。类中的所有对象都已正确反序列化,但 JsonConvert 对两个对象有问题。它们是 C# 中的字符串,其中一些字符串正确返回,其他字符串为空。由于 Json 非常大(30MB),我只能在这里发布一小段摘录,但它应该让您了解 JSON 的结构:

"attributes" : {
        "AnzahlFall" : 1,
        "Meldedatum" : 1585612800000, 
        "IdLandkreis" : "08327", 
        "Datenstand" : "26.10.2020, 00:00 Uhr", 
      }

这是众多领域之一。有问题的字符串是“IdLandkreis”和“Datanstand”。在 Json 文件中,这些值中的任何一个都不可能为空或为空,但是在再次反序列化和序列化后得到的是:

"attributes" : 
{"AnzahlFall":1,
"NeuerFall":0,
"Meldedatum":1601510400000,
"DatenStand":null,
"idLandkreis":null
}

这是整个 C# 部分:

    public class Attributes
{
    public int AnzahlFall { get; set; }

    public int NeuerFall { get; set; }

    public long Meldedatum { get; set; }

    public string DatenStand { get; set; }

    public string idLandkreis { get; set; }
}

public class Report
{
    public Attributes attributes { get; set; }
}


public class Caselist
{

    public bool exceededTransferLimit { get; set; }


    public List<Report> features { get; set; }

}

我用它来调用JsonConverter:

Caselist rki_data = JsonConvert.DeserializeObject(readData());

我尝试了什么:

我重命名了变量,但没有任何变化。通过 Caselist 解析时,输出看起来像这样:

Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid

这些数据是关于 Covid-19 的,由德国当地的一家科学研究所提供

您可以在此处获取部分数据(它被拆分为多个文件):

https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_COVID19/FeatureServer/0/query?where=1%3D1&outFields=IdLandkreis,AnzahlFall,Meldedatum,NeuerFall,Datenstand&outSR=4326&f=json

我会非常感谢你的帮助。

问候,乔纳森

标签: c#jsonjson.net

解决方案


Datenstand在 json 和DatenStandpoco 中。如果[JsonProperty("Datenstand")]您想保留您的 poco 名称但序列化名称应该不同,请使用

所以你的 poco 里会有这样的东西:

public class Attributes
{
    public int AnzahlFall { get; set; }
    public int NeuerFall { get; set; }
    public long Meldedatum { get; set; }
    [JsonProperty("Datenstand")]
    public string DatenStand { get; set; }
    [JsonProperty("IdLandkreis")]
    public string idLandkreis { get; set; }
}

我从您的 C# 中看到的更大问题是您似乎没有标准的命名约定。通常你会为 C# 使用 PascalCasing,为 json 文件使用 camlCasing。

如果您有此设置,您还可以将默认设置设置

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

推荐阅读