【问题标题】:NewtonSoft JsonConvert.DeserializeObject returns all properties as nullNewtonSoft JsonConvert.DeserializeObject 将所有属性返回为 null
【发布时间】:2019-02-13 14:16:45
【问题描述】:

我不知道这有什么问题:

public class Product
{
    public string code { get; set; }
    public string description { get; set; }
    public string tp { get; set; }
}

public class Return
{
    [JsonProperty("products")]
    public List<Product> Products { get; set; }
}

public class BlingJson
{
    [JsonProperty("return")]
    public Return Return { get; set; }
}

public static void Run()
{
    string str = "{ \"return\": { \"products\": [ { \"product\": { \"code\": \"8147-048PA\", \"description\": \"LEGEND 220v - HAIR CUTTER\", \"tp\": \"P\" } }, { \"product\": { \"code\": \"08164-148PA\", \"description\": \"FINALE - HAIR CUTTER\", \"tp\": \"P\" } } ] } }";

    BlingJson json = JsonConvert.DeserializeObject<BlingJson>(str);
}

在反序列化时,json.Return.Products 是一个包含两个产品的列表,但所有属性(codedescriptiontp)都为空。

为方便起见格式化 JSON:

{
    "return": {
        "products": [
            {
                "product": {
                    "code": "8147-048PA",
                    "description": "LEGEND 220v - HAIR CUTTER",
                    "tp": "P"
                }
            },
            {
                "product": {
                    "code": "08164-148PA",
                    "description": "FINALE - HAIR CUTTER",
                    "tp": "P"
                }
            }
        ]
    }
}

我看到过类似的问题,但没有找到适用于此案例的问题。 如何解决?

谢谢。

【问题讨论】:

  • json2csharp.com,或者visual studio的特殊过去可以告诉你缺少的层。在产品和产品之间。
  • @xdtTransform 太棒了,谢谢。

标签: c# json json.net


【解决方案1】:

您的 JSON 意味着您需要一个围绕产品对象的包装器。例如:

public class ProductWrapper
{
    public Product Product { get; set; }
}

这让你的Return 类看起来像这样:

public class Return
{
    [JsonProperty("products")]
    public List<ProductWrapper> Products { get; set; }
}

【讨论】:

  • 大卫,希望你不介意回到这个话题,但我不能(是的,有意的)围绕这个话题。我的理解是,在 JSON 中,productsreturn 的属性,其类型是product 的数组。我弄错了吗? (如果您希望我将其纳入我的问题中,或者即使我应该问一个新问题,请告诉我。)
  • 问题已经被问及回答了,恐怕你现在不能改变它。话虽如此,问题是json不寻常。 products 数组包含一个包含产品对象的对象数组(包装器)。如果您可以更改json,那将是可取的。
【解决方案2】:

您可以使用@DavidG 提到的 Wrapper 类来使其按照给定的 Json 格式工作。但是,如果您不能更改您的课程,您必须将您的 Json 调整为这种格式:

{
    "return": {
        "products": [
            {
                "code": "A",
                "description": "B",
                "tp": "C"
            },
            {
                "code": "D",
                "description": "E",
                "tp": "F"
            }
        ]
    }
}

【讨论】:

  • 感谢您的回答。在这种情况下,我可以在服务返回 json 时修改我的类,但这有助于我更好地理解这个问题。不过,我必须复制它并应用与原版相同的缩进样式-也许考虑更新您的答案以说明该样式,因为它可能对未来的读者有所帮助;)(如果您愿意,我也可以自己编辑)
  • 我已经完成了缩进,如果您觉得可以添加更多内容,请随时这样做:)
  • 谢谢,我修改它以精确匹配原始值(无论如何都省略了属性值)。
猜你喜欢
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多