当类名是根元素时,Newtonsoft JSON无法反序列化

4
Newtonsoft json的DeserializeObject在根元素为类名称时无法解析json消息。
var json = "  {\r\n \"amount\": {\r\n    \"currency\": \"EUR\",\r\n    \"value\": 99792\r\n  }\r\n}";
var amount = JsonConvert.DeserializeObject<Amount>(json)

和类

class Amount 
{
    [JsonProperty("value")]
    public decimal? Value { get; set; }

    [JsonProperty("currency")]
    public string Currency { get; set; }
}

在这种情况下,Amount属性为null。问题在于金额嵌套在更复杂的JSON中,我发现它始终为空,因为它以“amount”开头。当然,我尝试在Amount类中使用一些注释,例如[DataContract]和[JsonObject],但仍然为空。 在这种情况下:
 var json = "{\r\n    \"currency\": \"EUR\",\r\n    \"value\": 99792\r\n }";

第一种情况中,json已经被解析。问题是如何反序列化该json?

3个回答

5
您应该按照这样的方式设计您的类:
public class Amount
{
    [JsonProperty("value")]
    public decimal? Value { get; set; }

    [JsonProperty("currency")]
    public string Currency { get; set; }
}

public class RootObject
{
    [JsonProperty("amount")]
    public Amount Amount { get; set; }
}

然后反序列化 RootObject

var amount = JsonConvert.DeserializeObject<RootObject>(json);

注意:您可以将 JSON 粘贴到 json2csharp.com,它会自动将您的 JSON 建模成 C# 类。


5
您可以创建一个包装类Root,该类具有一个称为Amount的单个元素。例如,
public class Root
{
    [JsonProperty("amount")]
    public Amount Amount { get; set; }
}

你需要将数据反序列化为 Root 的实例。例如:
var amount = JsonConvert.DeserializeObject<Root>(json);

或者,如果您不想声明另一个类,也可以使用

var innerJson = JObject.Parse(json)["amount"].ToString();
var amount = JsonConvert.DeserializeObject<Amount>(innerJson);

4
您的JSON无法正确反序列化的原因是,Newtonsoft不知道如何将amount转换为您的类,该类具有两个变量,即: currencyvalue。要反序列化第一个案例中的JSON,您需要一个名为amount的类。此对象包含另一个与您正在使用的Amount 类匹配的对象。
当您添加缺少的类RootObject并将其反序列化到RootObject时,您将看到JSON正确反序列化。 您需要的类:
public class Amount
{
    [JsonProperty("currency")]
    public string Currency { get; set; }
    [JsonProperty("value")]
    public int Value { get; set; }
}

public class RootObject
{
    [JsonProperty("amount")]
    public Amount Amount { get; set; }
}

用于反序列化操作

var amount = JsonConvert.DeserializeObject<RootObject>(json)

寻找类的简单方法

我发现www.json2csharp.com 是一个非常好的资源。如果不确定,可以将你的JSON复制/粘贴到该网站以获取所需的所有类。将它们复制到你的项目中并进行反序列化到RootObject。如果你的JSON格式有问题,也可以在这里查找错误。


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