2015-11-08 48 views
2

我試圖從Json的獲取值的對象,所有的都是這樣一種形成: http://services.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=4798如何從複雜的Json對象中獲取值?

我試了幾個庫,但他們沒有引起我想要的方式。我想將這些值放入特定的數據成員。

這是我最後一次嘗試,它運行但似乎我的Datammbers沒有得到任何值。

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

只需粘貼像[這一個] A轉換器源JSON( http://json2csharp.com/)(Google上的第一個結果)。你的屬性名稱與Json中的名稱不同,這就是爲什麼它不起作用。 –

+0

@ Pierre-LucPineault,非常感謝您的回答!我現在在上面。 –

+0

我注意到字符串有一些額外的屬性值,你的物品類沒有。所以簡單的Deserilization不能返回對象。你的輸入看起來不對我 –

回答

2

,如果你可以嘗試Newtonsoft我可以提供一個方式..它非常好,更好的辦法,據我認爲

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

非常感謝!這就是我想到的,它對我想要的所有Json文件都非常有用。我在這個項目中嘗試了與牛頓軟件的合作,但是jist做了一件不同的事情,使得它不起作用。 –

+0

沒問題。我很高興解決了這個問題。前進。並享受代碼/知識共享。快樂編碼。 –

-1

有,你可以在C#中使用多個JSON序列化。一些具有更好的性能,一些具有更好的容錯性,另一些具有循環參考處理。

在你的情況,我看到你只是想要一個對象,而不是傳遞它(到一個WCF)在任何地方。你可以按照這個問題的第二個答案:Deserialize JSON into C# dynamic object?示例代碼從這個問題的答案複製:

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#中的動態對象可以不聲明一個類爲它讀取性能。