JSON数组中的嵌套项未被反序列化

3

我正在尝试从API反序列化一个JSON字符串。

除了嵌套项-位置(Location)始终为空之外,所有工作都正常。

这是字符串的结构:

[
    {
        "CompanyProfile": "<p>A&amp;B Inc etc...</p>",
        "Address": "56 Test Street, Test, UK",
        "Location": {
            "Latitude": 61.52787,
            "Longitude": -4.32095,
            "Zoom": 13,
            "Icon": null,
            "Format": 0,
            "Api": null,
            "SearchTyped": null
        },
        "Id": 1723,
        "Name": "A&B Inc"
    },
        {
        "CompanyProfile": "<p>B&amp;C Inc etc...</p>",
        "Address": "57 Test Street, Test, UK",
        "Location": {
            "Latitude": 61.2122,
            "Longitude": -4.31111,
            "Zoom": 13,
            "Icon": null,
            "Format": 0,
            "Api": null,
            "SearchTyped": null
        },
        "Id": 1723,
        "Name": "B&C Inc"
    },
]

以下是需要映射的类:

public class MemberDto
{
    public int Id { get; set; }
    public string? Name { get; set; }
    public string? CompanyProfile { get; set; }
    public string? Address { get; set; }
    public Location? Location { get; internal set; }
}

public class Location
{
    public decimal Latitude { get; set; }
    public decimal Longitude { get; set; }
}

这是反序列化代码:
var result = await response.Content.ReadAsStringAsync();
var members = JsonConvert.DeserializeObject<List<MemberDto>>(result);

我知道我也可以使用ReadFromJsonAsync<List<MemberDto>>(),但是使用ReadFromString可以在反序列化之前检查JSON。无论如何,对于ReadFromJsonAsync结果完全相同。

除了Location外,所有内容都成功反序列化了。

有人知道问题是什么吗?


3
移除_internal_:public Location?Location { get; internal set; }更新后的代码为:public Location? Location { get; set; } 这段代码的意思是设置一个公共的可空的Location属性,它允许从外部访问并获取其值,同时允许内部修改其值。移除_internal_关键字后,该属性的设置也将变得公开可见。 - Markus Meyer
3
为什么位置设置器是内部的? - McNets
让生活变得更轻松;将您的JSON粘贴到https://app.quicktype.io中,并按照生成代码的注释头中的说明进行操作;将生成的代码粘贴回您的应用程序中,并将头文件中的一行代码放入应用程序代码的适当位置(`var members = YourRootObjectName.FromJson(result)`)。 - Caius Jard
1
@MarkusMeyer - 感谢您也发现了答案。 - wingyip
1
我两天前遇到了同样的问题。这是一个警告,当你通过快速重构自动向类添加属性时,默认情况下会将setter设置为internal。这是微软糟糕的设计选择,因为它会导致此类问题。(我的问题在于asp.net模型绑定) - JHBonarius
显示剩余2条评论
1个回答

4

移除Location的setter中的internal访问修饰符。

public Location? Location { get; set; } 

补充答案:通常情况下,为了使反序列化工作正常,设值器应该是公开的。 因此,任何非公共修饰符(例如internalprotectedprivate)都应该被移除。 - OfirD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接