反序列化Json String不起作用

时间:2015-05-24 13:06:24

标签: c# php json

我想从php网站反序列化一个Json字符串。不幸的是,每当我尝试它时,它将为medianPrice返回null ....为什么?

In [5]: import theano.tensor.signal.conv

In [6]: theano.tensor.signal
Out[6]: <module 'theano.tensor.signal' from '/usr/local/lib/python2.7/site-packages/theano/tensor/signal/__init__.pyc'>

In [7]: theano.tensor.signal.conv
Out[7]: <module 'theano.tensor.signal.conv' from '/usr/local/lib/python2.7/site-packages/theano/tensor/signal/conv.pyc'>

从网站返回的Json如下:

public class PriceInfo
{
    public string success { get; set; }
    public double lowestPrice { get; set; }
    public string volume { get; set; }
    public string medianPrice { get; set; }
}

WebClient client = new WebClient();
string url = "http://steamcommunity.com/market/priceoverview/?country=US&currency=1&appid=730&market_hash_name=" + name;
byte[] html = client.DownloadData(url);
UTF8Encoding utf = new UTF8Encoding();
string return_value = utf.GetString(html);
PriceInfo priceInfo = new JavaScriptSerializer().Deserialize<PriceInfo>(return_value);
if( Double.Parse(priceInfo.medianPrice) > 0.15 )
{
      string blablu = "hello";
}

我希望你能帮助我!

4 个答案:

答案 0 :(得分:0)

我强烈建议您尝试使用Newtonsoft.Json

你会发现处理你的Jason对象更容易

您的代码将是这样的(未经测试

PriceInfo defaultCallResult = JsonConvert.DeserializeObject<PriceInfo>(return_value);

答案 1 :(得分:0)

您的JSON属性名为&#34; median_price&#34; (使用下划线),但您的C#属性是&#34; medianPrice&#34;。

您可以使用Json.NET,这样您就可以使用属性更改映射。

使用Json.NET,按如下方式装饰你的medianPrice属性:

[JsonProperty(PropertyName = "median_price")]
public string medianPrice { get; set; }

答案 2 :(得分:0)

我不确定JavaScriptSerializer如何成功解析你的类,因为键几乎不匹配类属性。

JavaScriperSerializer is obsolete,我建议您使用其他序列化程序,例如Json.NET

public class PriceInfo
{
   [JsonProperty("success")]
   public string Success { get; set; }

   [JsonProperty("lowest_price")]
   public double LowestPrice { get; set; }

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

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

当你想要反序列化时:

PriceInfo priceInfo = JsonConvert.DeserializeObject<PriceInfo>(returnValue);

答案 3 :(得分:0)

首先,如其他答案中所述,您的属性名称不匹配。

所以拿

public class PriceInfo
{

    public string success { get; set; }
    public string lowest_price { get; set; }
    public string volume { get; set; }
    public string median_price { get; set; }
}

编辑:如Yuval所述,您不能将JsonProperty与JavaScriptSerializer一起使用,因此您需要坚持使用json中的属性名称。

然后,json中有货币信息。所以你需要摆脱这些:

string return_value = "{\"success\":true,\"lowest_price\":\"&#36;0.04\",\"volume\":\"3,952\",\"median_price\":\"&#36;0.02\"}";
string return_valueconverted = HttpUtility.HtmlDecode(return_value);
PriceInfo priceInfo = new JavaScriptSerializer().Deserialize<PriceInfo>(return_valueconverted);
priceInfo.lowest_price = priceInfo.lowest_price.TrimStart('$');
priceInfo.median_price = priceInfo.median_price.TrimStart('$');

正如您所看到的,这会对这些值进行HtmlDecode,然后从该值中修剪美元符号。

在此处查看有关Html字符集的更多信息: http://www.w3.org/MarkUp/html-spec/html-spec_13.html