NewtonSoft JsonConvert.DeserializeObject返回所有属性为空。

3
我无法弄清楚这个有什么问题:
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"
                }
            }
        ]
    }
}

我看到了类似的问题,但没有找到适用于这种情况的答案。如何解决?
谢谢。

http://json2csharp.com/,或者Visual Studio的特殊粘贴功能可以显示产品和产品之间缺失的层。 - xdtTransform
@xdtTransform 很棒,谢谢。 - Marc.2377
2个回答

3
您的JSON表明您需要在产品对象周围添加一个包装器。例如:
public class ProductWrapper
{
    public Product Product { get; set; }
}

这会使你的Return类看起来像这样:
public class Return
{
    [JsonProperty("products")]
    public List<ProductWrapper> Products { get; set; }
}

David,希望你不介意回到这个问题,但我无法理解(是的,故意的)。我的理解是,在JSON中,“products”是“return”的属性,其类型是“product”的数组。我错了吗?(让我知道如果你想把这个问题并入我的问题中,或者甚至是否应该问一个新问题。) - Marc.2377
问题已经被提出并回答了,恐怕现在无法更改。话虽如此,问题在于json格式不寻常。产品数组包含一系列对象(外壳),这些对象包含产品对象。如果你可以更改json格式,那会更好。 - DavidG

1
您可以像 @DavidG 提到的那样使用一个包装类来按照给定的Json格式使其正常工作。然而,如果您不能更改您的类,您需要调整Json格式为如下所示:
{
    "return": {
        "products": [
            {
                "code": "A",
                "description": "B",
                "tp": "C"
            },
            {
                "code": "D",
                "description": "E",
                "tp": "F"
            }
        ]
    }
}

谢谢您的回答。在这种情况下,我可以在服务返回JSON时修改我的类,但是这仍然帮助我更好地理解了问题。虽然我不得不复制它并应用与原始样式相同的缩进风格 - 也许考虑更新您的答案以适应该样式,因为它可能有助于未来的读者 ;)(如果您愿意,我也可以自己编辑它) - Marc.2377
1
我已经完成了缩进,如果你觉得可以添加更多内容,随意添加即可 :) - kowsikbabu
谢谢,我已经修改它以精确匹配原始代码(无论如何都不包括属性值)。 - Marc.2377

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