繁体   English   中英

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

[英]How can I get values from a complex Json object?

我正在尝试从 Json 对象中获取值,这些值都是这样形成的: http ://services.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=4798

我尝试了几个库,但没有一个是我想要的。 我想将值放入特定的数据成员中。

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

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);
        }
    }
}

这就是我的班级“项目”的样子

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; }
    }
}

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

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

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

在您的情况下,我看到您只是想要一个对象而不将其传递给(到 WCF)任何地方。 您可以按照这个问题的第二个答案:将JSON 反序列化为 C# 动态对象? 从该答案复制的示例代码:

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM