如何从复杂的Json对象中获取值?

时间:2015-11-08 18:21:09

标签: c# json

我试图从Json对象获取所有形成的值,如下所示: http://services.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=4798

我尝试了几个库,但没有一个按照我想要的方式生成。我想将值放入特定的Datamembers。

这是我的最后一次尝试,它运行但似乎我的Datamembers没有获得任何值。

namespace JSON_Data
{
    public partial class Form1 : Form
        public Form1()
        {
            InitializeComponent();
            string jsonString = @"{""item"":{""icon"":""http://services.runescape.com/m=itemdb_rs/4996_obj_sprite.gif?id=4798"",""icon_large"":""http://services.runescape.com/m=itemdb_rs/4996_obj_big.gif?id=4798"",""id"":4798,""type"":""Ammo"",""typeIcon"":""http://www.runescape.com/img/categories/Ammo"",""name"":""Adamant brutal"",""description"":""Blunt adamantite arrow...ouch"",""current"":{""trend"":""neutral"",""price"":305},""today"":{""trend"":""neutral"",""price"":0},""members"":""true"",""day30"":{""trend"":""positive"",""change"":""+2.0%""},""day90"":{""trend"":""positive"",""change"":""+8.0%""},""day180"":{""trend"":""positive"",""change"":""+23.0%""}}}";

            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Item));
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            Item obj = (Item)ser.ReadObject(stream);
        }
    }
}

这就是我的课程“Item”看起来

namespace JSON_Data
{
    [DataContract]
    public class Item
    {
        [DataMember]
        public string Icon { get; set; }
        [DataMember]
        public string Icon_large { get; set; }
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Description { get; set; }
        [DataMember]
        public string Members { get; set; }
    }
}

2 个答案:

答案 0 :(得分:2)

如果您可以尝试 Newtonsoft ,我可以提供一种方式..就我认为而言,它是非常好的和更好的方法

var ob = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonString);
Item a = ((JObject)ob["item"]).ToObject<Item>();

答案 1 :(得分:-1)

您可以在C#中使用多个JSON序列化程序。一些具有更好的性能,一些具有更好的容错性,而另一些具有循环参考处理。

在你的情况下,我看到你只想要一个对象,而不是在任何地方传递它(到WCF)。您可以按照此问题的第二个答案:Deserialize JSON into C# dynamic object?从该答案复制的示例代码:

compile *.c program

C#中的动态对象允许您在不声明类的情况下读取属性。