当类的名称是根元素时,Newtonsoft json 不会反序列化

Ale*_*Mor 3 .net c# json.net deserialization json-deserialization

当类的名称是根元素时,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)
Run Code Online (Sandbox Code Playgroud)

和班级

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

    [JsonProperty("currency")]
    public string Currency { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,金额属性是null。问题是金额嵌套在更复杂的 json 中,我发现它总是返回空的,因为它以“金额”开头。当然,我在 Amount 类中尝试了一些注释,如 [DataContract] 和 [JsonObject] 但它仍然是空的,在以下情况下:

 var json = "{\r\n    \"currency\": \"EUR\",\r\n    \"value\": 99792\r\n }";
Run Code Online (Sandbox Code Playgroud)

然后被正确解析。问题是如何在第一种情况下反序列化 json?

Roa*_*ner 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; }
}
Run Code Online (Sandbox Code Playgroud)

然后反序列化RootObject

var amount = JsonConvert.DeserializeObject<RootObject>(json);
Run Code Online (Sandbox Code Playgroud)

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


Anu*_*wan 5

您可以创建一个包装类Root,它有一个名为 的元素Amount。例如,

public class Root
{
    [JsonProperty("amount")]
    public Amount Amount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您现在需要反序列化为 的实例Root。例如,

var amount = JsonConvert.DeserializeObject<Root>(json);
Run Code Online (Sandbox Code Playgroud)

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

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