苦苦挣扎将JSON字符串转换为对象

时间:2016-11-04 14:55:45

标签: c# asp.net json json-deserialization

我正在努力将如何将以下价格报价JSON数据转换为C# 对象:

{"MyFeed":
{"@Provider":"SomeProvider","MMM":
    {"@name":"3M Corp","low":"194.80","high":"136.78","change":"2.80","pctchange":"0.22","ask":"135.15","bid_time":"20161104131845","bid":"134.80"}
}}

我创建了一个C#类:

public class Quote
{
   public string Provider { get; set; }
   public Data Info { get; set; }
}

public class Data
{
  public string name { get; set; }
  public decimal low { get; set; }
  public decimal high { get; set; }
  public decimal change { get; set; }
  public decimal pctchange { get; set; }
  public decimal ask { get; set; }
  public DateTime bid_time { get; set; }
  public decimal bid { get; set; }
}

然后,在代码中,我使用HttpWebRequest获取数据,运行得很好。但是反序列化JSON数据的步骤并不起作用。它不会抛出错误,它只是没有数据。该代码是:

    var request = HttpWebRequest.Create(new Uri("<request URL here>")) as HttpWebRequest;
    request.Method = "POST";
    var response = request.GetResponse();
    using (Stream stream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            Quote quote = JsonConvert.DeserializeObject<Quote>(reader.ReadToEnd());
            lblPrice.Text = string.Format("{0:c}", quote.Data.ask);
        }
    }

我逐步完成了代码,因此我知道Web请求正在运行并返回一个JSON字符串。我只是不知道如何构造C#类来接受反序列化的数据。帮助将不胜感激!

4 个答案:

答案 0 :(得分:3)

您应该定义这样的属性。

[JsonProperty(PropertyName = "@Provider")]
public string Provider { get; set; }

[JsonProperty(PropertyName = "@name")]
public string name { get; set; }

你还有其他几十个问题,比如你的字段在json中不是十进制,错误的类结构。这是你的课程应该如何:

    public class MyFeed
    {
        [JsonProperty(PropertyName = "@Provider")]
        public string Provider { get; set; }

        public MMM MMM { get; set; }
    }

    public class RootJsonObject
    {
        public MyFeed MyFeed { get; set; }
    }

    public class MMM
    {
        [JsonProperty(PropertyName = "@name")]
        public string name { get; set; }
        public string provider { get; set; }
        public string low { get; set; }
        public string high { get; set; }
        public string change { get; set; }
        public string pctchange { get; set; }
        public string ask { get; set; }
        public string bid_time { get; set; }
        public string bid { get; set; }
    }

如何进行转换:

RootJsonObject quote = JsonConvert.DeserializeObject<RootJsonObject>(json);

答案 1 :(得分:2)

您是否尝试过使用此json2csharp

答案 2 :(得分:1)

  • 使用handle指定序列化字符串中的名称。
  • 当您传入包含您感兴趣的对象的对象时,您需要将整个Quote类型包装在不同的类型中。
  • 您需要指定JsonProperty类型的序列化方式。

这是一个完整且有效的解决方案,与你的json。

DateTime

答案 3 :(得分:0)

你的Quote类应该是Serializable。使用DataMembers为其添加Serializable属性或向其添加DataContract属性。