NewtonSoft JsonConvert.DeserializeObject返回所有属性为null

时间:2019-02-13 14:16:45

标签: c# json json.net

我不知道这是怎么回事:

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"
                }
            }
        ]
    }
}

我见过类似的问题,但没有找到适用于此情况的问题。 该怎么解决?

谢谢。

2 个答案:

答案 0 :(得分:3)

您的JSON表示您需要在产品对象周围包装一个包装。例如:

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

这使您Return的班级看起来像这样:

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

答案 1 :(得分:1)

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

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