【问题标题】:JsonDeserialize returns null for some strings (only for some)JsonDeserialize 为某些字符串返回 null(仅对某些字符串)
【发布时间】:2021-02-09 22:25:45
【问题描述】:

我正在尝试将一个相当大的 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:

案例列表 rki_data = JsonConvert.DeserializeObject(readData());

我尝试了什么:

  • 为“iDLandkreis”使用其他数据类型,例如 int -> 仍然为 0

我重命名了变量,但没有任何变化。通过 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 P>

这些数据是关于 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# 模型中的这些属性是什么数据类型?您正在运行什么代码来进行反序列化?
  • 将信息添加到帖子中
  • Datenstand 在 json 和 DatenStand 在 poco。如果您想保留您的 poco 名称,请使用 [JsonProperty("Datenstand")],但序列化名称应该不同

标签: c# json json.net


【解决方案1】:

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

所以你的 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。

如果您有此设置,您还可以将default settings 设置为

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

【讨论】:

  • 如果我通过对象parste,输出仍然看起来像这样:01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid 01060Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid Landkreisid
  • @Jonnyb170 你能在 OP 中分享你的 JSON 吗?还有可能,如果您已经设置了一些默认设置或合同解析器?至少足以验证你得到了什么,因为现在看来它并不是真正可重现的
  • 添加了数据链接。抱歉,我现在不太了解编码,所以我真的不知道什么是contractresolver。但我可能没有,因为我根本没有对 JsonConvert 进行任何更改。
【解决方案2】:

C# 区分大小写。我认为问题来自您的财产名称:

  • 数据站 != 数据站
  • idLandkreis != IdLandkreis

Seb

【讨论】:

  • 您可以通过指定JsonSerializerOptionsPropertyNameCaseInsensitive = true 来解决此问题。见JsonSerializerOptions
  • 虽然 c# 区分大小写,但 Json.Net 不区分大小写。 默认情况下不区分大小写。当外壳不同时,它将匹配属性就好了。 dotnetfiddle.net/mOsfsM
  • @gunr2171 这不是对如何设置 defaultSettings 的假设吗?
  • @gunr2171 这对于System.Text.Json 是不正确的。从 Microsoft 文档 > PropertyNameCaseInsensitive:获取或设置一个值,该值确定属性名称在反序列化期间是否使用不区分大小写的比较。默认值为 false。
  • @DouglasRiddle 对于微软的 json 库可能不正确,但这个问题被标记为“Json.Net”,并且正在使用的代码来自该库。
【解决方案3】:

我终于明白了。我的代码或 JsonConvert 这一切都不是问题。 我只是忘记将特定对象放入 JSON 请求的查询中。我在这里发布的 Json 文件不是我在代码中下载的那个。我下载错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多