Json.NET反序列化 - 关键值对?

时间:2014-02-14 17:13:34

标签: c# json

我目前在使用Json.NET反序列化一组名称键/值对时遇到一些麻烦

这是我正在尝试使用的Json的一个例子:

"prices":
{
    "SharedMinPrice":{"USD":"0.00"},
    "SharedAveragePrice":{"USD":"0.00"},
    "PrivateMinPrice":{"USD":"8.82"},
    "PrivateAveragePrice":{"USD":"26.85"},
    "MinPrice":{"USD":"8.82"},
    "AveragePrice":{"USD":"26.85"}}
}

如果我尝试将其反序列化为自定义类型的列表,则会出现以下错误:

  

无法反序列化当前的JSON对象(例如{“name”:“value”})   进入类型'System.Collections.Generic.List`1 [APITypes.PropertyPrice]'   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。

我在我的支持类中使用以下代码:

[JsonProperty("prices")]
    public List<PropertyPrice> Prices { get; set; }

我的PropertyPrice类是:

    internal class PropertyPrice
{

    [JsonProperty("sharedMinPrice")]
    public float sharedMinPrice { get; set; }

    [JsonProperty("sharedAveragePrice")]
    public float sharedAveragePrice { get; set; }

    [JsonProperty("privateMinPrice")]
    public float privateMinPrice { get; set; }

    [JsonProperty("privateAveragePrice")]
    public float privateAveragePrice { get; set; }

    [JsonProperty("minPrice")]
    public float minPrice { get; set; }

    [JsonProperty("averagePrice")]
    public float averagePrice { get; set; }
}

我做错了什么?

提前感谢您的任何帮助。

4 个答案:

答案 0 :(得分:1)

由于它不是数组,因此您可以使用Dictionary<string,T>。这段代码有用......

var obj = JsonConvert.DeserializeObject<Price>(json);
Console.WriteLine(obj.Prices["SharedMinPrice"]["USD"]);

...

public class Price
{
    public Dictionary<string, Dictionary<string, decimal>> Prices { set; get; }
}

答案 1 :(得分:1)

您正尝试将{"USD": 3.50}表单的JSON反序列化为float。那些类型不匹配。下面我定义了一个新类型MoneyAmount

internal class MoneyAmount
{
    public float USD { get; set; }
}

internal class PropertyPrice
{

    [JsonProperty("sharedMinPrice")]
    public MoneyAmount sharedMinPrice { get; set; }

    [JsonProperty("sharedAveragePrice")]
    public MoneyAmount sharedAveragePrice { get; set; }

    [JsonProperty("privateMinPrice")]
    public MoneyAmount privateMinPrice { get; set; }

    [JsonProperty("privateAveragePrice")]
    public MoneyAmount privateAveragePrice { get; set; }

    [JsonProperty("minPrice")]
    public MoneyAmount minPrice { get; set; }

    [JsonProperty("averagePrice")]
    public MoneyAmount averagePrice { get; set; }
}

或者,如果您想动态处理各种货币,可以使用Dictionary<string, float>代替MoneyAmount

答案 2 :(得分:0)

忘记开头{开头

{“price”:{“SharedMinPrice”:{“USD”:“0.00”},“SharedAveragePrice”:{“USD”:“0.00”},“PrivateMinPrice”:{“USD”:“8.82”} “PrivateAveragePrice”:{ “USD”: “26.85”}, “MinPrice”:{ “USD”: “8.82”}, “AveragePrice”:{ “USD”: “26.85”}}}

- &GT;使用像http://jsonformatter.curiousconcept.com/这样的东西来测试你的json没有反序列化

此外,您不会将其作为数组传递:

{"employees": [{"id":"1"},{"id":"2"}]}

答案 3 :(得分:0)

你的json不是一个数组类型,它应该是这样的:

"prices":
{   
    "SharedMinPrice":{"USD":"0.00"},
    "SharedAveragePrice":{"USD":"0.00"},
    "PrivateMinPrice":{"USD":"8.82"},
    "PrivateAveragePrice":{"USD":"26.85"},
    "MinPrice":{"USD":"8.82"},
    "AveragePrice":{"USD":"26.85"}}
}