JsonConvert仅反序列化类字段

时间:2018-05-02 11:32:01

标签: c# json.net

这是json:

{
    "odata.metadata": ".....",
    "value": [
        {
            "AbsEntry": 10,
            "ItemNo": "....",
            "UoMEntry": -1,
            "Barcode": "2000000000022",
            "FreeText": "Ean13"
        }
    ]
}

这是课程:

public class BarCode
{
     public int AbsEntry { get; set; }
     public string ItemNo { get; set; }
     public string Barcode { get; set; }
     public string FreeText { get; set; }
 }

此方法返回null

BarCode barcode = JsonParser.DeserializeObjcet<BarCode>(json);

是否有任何属性或其他可能导致调用DeserializeObject仅将我的类的字段反序列化(名称正是Json的名称)?

3 个答案:

答案 0 :(得分:3)

您缺少根对象:

public class RootObject
{
    public string __invalid_name__odata.metadata { get; set; }
    public List<BarCode> value { get; set; }
}

请注意,无效名称oprperty可以删除,因此它将被激活!

即使您只需要Value部分,您也必须从根目录进行反序列化,然后导航到您需要的子属性。

答案 1 :(得分:3)

您需要创建类似下面的类而不是BarCode

public class Value
{
 public int AbsEntry { get; set; }
 public string ItemNo { get; set; }
 public int UoMEntry { get; set; }
 public string Barcode { get; set; }
 public string FreeText { get; set; }
}

或者您可以更改JSON格式

"BarCode": [
        {
            "AbsEntry": 10,
            "ItemNo": "....",
            "UoMEntry": -1,
            "Barcode": "2000000000022",
            "FreeText": "Ean13"
        }
    ]

答案 2 :(得分:3)

如果希望反序列化成功,则类的结构应与JSON的结构匹配。

如果您想要部分反序列化,例如只有将values属性反序列化到您的类中,您才能使用此代码:

JObject jObject = JObject.Parse(json);
BarCode barcode = jObject["values"].Children().First().ToObject<BarCode>();

使用此解决方案,您无需重构您的课程或添加新课程。