2014-03-30 145 views
0

试图从web api反序列化json。这里是传入的JSON:Newtonsoft.Json反序列化问题

{"0":{"productname":"France and the French", 
"imageurl":"http://img.rakuten.com/PIC/32994457/0/1/250/32994457.jpg", 
"producturl":"http://www.theurl.com/rd.aspx?3d", 
"price":"19.51", 
"currency":"USD", 
"saleprice":"", 
"storename":"Buy.com (dba Rakuten.com Shopping)"} 
} 

这里是我的数据类:

public class Product 
{ 
    [JsonProperty("productname")] 
    public string productname { get; set; } 

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

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

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

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

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

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

这里是代码:

string json = upcclient.GetProductJSON(upc, accessToken); 
Product myproduct = JsonConvert.DeserializeObject<Product>(json); 

应该是相当直截了当。 json正在被人工填充,但无论我尝试什么 - 产品作为主数据类,产品阵列等中的产品列表,myproduct从未被填充。

感谢您的帮助提前。这些东西通常不会很难。我已经做了50次左右,但这一次正在接近我。

+0

关键可能是在开头,用'{“0”:' –

+0

你似乎知道你自己的问题的答案..但你已经在想它了。 'Product作为主数据类,产品数组中的产品列表 - 正确。它是一个数组。将它反序列化为一个。 –

+0

从技术上讲,JSON数组应位于方括号{“0”:[{data here}]}内。在这种情况下,它不是。我从大括号内的JSON数组提供者处获取它,并且只有一个项目。我刚才尝试了以下内容,但是没有去 列表 p =(列表)JsonConvert.DeserializeObject(json,typeof(List )); –

回答

1

在您发布的示例JSON中,Product是根对象的0字段中包含的对象,并且该根对象似乎没有使用JSON数组语法。不幸的是,如果您希望获得任意数量的结果,那么优雅地映射到C#类将会非常难看。如果你知道你只会得到一个产品,你可以简单地添加一个根类:

public class ProductWrapper 
{ 
    [JsonProperty("0")] 
    public Product Product 
    { 
    get; 
    set; 
    } 
} 

做:

string json = upcclient.GetProductJSON(upc, accessToken); 
Product myproduct = JsonConvert.DeserializeObject<ProductWrapper>(json).Product; 

我怀疑这个API的设计可能返回多个产品,虽然,所以这可能不是你想要的。如果这是您可以控制的API,则可能需要请求JSON实际返回产品的数组,而不是它现在返回的对象。

+0

他们正好在上面,我正在超越它。您的解决方案正常工作(假设产品更改为ProductWrapper)。谢谢。我刚开始听说JSON在任何时候都是错误的。 –