2013-04-11 413 views
0

好吧,所以我一直被困在JSON.NET之前,我又被卡住了,多虧了我最後一個問題,你們幫助我,我成功地完成了我的項目:3。但是現在我需要反序列化一個並不真正擁有密鑰的JSON。那麼它只是一個整數,它可以在0 - 50之間變化,這意味着我不知道如何做到這一點。我試圖用一個IDictionary但慘遭失敗...反正繼承人的JSON:用c#解析JSON沒有鑰匙

{ 
"response": { 
    "success": 1, 
    "current_time": 1362339098, // this will return the time when cache was generated 
    "prices": { 
     "35": { // defindex 
      "11": { // quality 
       "0": { // price index (crate # or unusual effect, 0 when not used) 
        "current": { // current price 
         "currency": "keys", 
         "value": 39, 
         "value_high": 41, 
         "date": 1357515306 // date when the price was updated 
        }, 
        "previous": { // previous price 
         "currency": "keys", 
         "value": 37, 
         "value_high": 39 
        } 
       } 
      }, 
      "3": { // quality 
       "0": { // price index 
        "current": { 
         "currency": "metal", 
         "value": 0.33, 
         "value_high": 0.66 
        } 
       } 
      } 
     }, 
     "5002": { // refined metal, useful for converting usd prices into metal 
      "6": { 
       "0": { 
        "current": { 
         "currency": "usd", 
         "value": 0.39, 
         "value_high": 0.42, 
         "date": 1358090106 
        } 
       } 
      } 
     },       
     "5022": { // one of the crate defindex 
      "6": { 
       "1": { // crate #1 
        "current": { 
         "currency": "metal", 
         "value": 1.33, 
         "value_high": 1.55, 
         "date": 1357515175 
        } 
       } 
      } 
     } 
    } 
} 
} 

(DAT格式... ...再次)

而且繼承人我可憐的企圖:

public class Json1 { 
    public Json2 response { get; set; } 
} 
public class Json2 { 
    public int success { get; set; } 
    public string current_time { get; set; } 
    public IDictionary<int, Json3> prices { get; set; } 
} 
public class Json3 { 

} 
public class Json4 { 

} 
public class Json5 { 
    public Json6 current { get; set; } 
} 
public class Json6 { 
    public string currency { get; set; } 
    public string value { get; set; } 
    public string value_high { get; set; } 
} 

Json 3和4是空的,因爲我一直刪除嘗試不同的東西...

但是啊...我已經習慣了JSON,但無法弄清楚這一點。任何友好的回覆都會提前獲得大力讚賞。

(我知道我用了一些彩車和長字符串,這是故意的,但我想是可以改變的)

+0

所以我很困惑,你說JSON可以變化0-50,但是你發佈的JSON是5002到5022.這是否意味着總是隻有兩個條目可以變化50(如此5000到5050)或者這是否意味着你有0-50個數字可以是任何數字? – AlexLordThorsen 2013-04-11 17:42:34

+0

@Rawrgulmuffins你可以看看Defindex,它可以隨着時間的變化而變化,之後在0-600之間變化,此後它在0-55之間變化,但將來會升高。我應該對此更加具體。 – LeCoffee 2013-04-11 17:55:19

+0

我的頭腦中有一個解決方案是擁有4個嵌套的foreach語句(一個用於defindex,一個用於質量,一個用於價格,然後一個用於當前和以前)。 – AlexLordThorsen 2013-04-11 18:21:24

回答

1

我personnally使用Newtonsoft.Json是非常好的,你可以在http://json.codeplex.com/ 它處理的發現匿名類型和linq之間的許多其他的東西。

還有一個很好的文檔。 SI你應該確定:

只是一個簡單的例子:

連載:

var listId = new List<int>(); 
listId.Add(1); 
listId.Add(2); 
listId.Add(3); 
String jsonList = JsonConvert.SerializeObject(listId); 

反序列化:

List<int> listID = JsonConvert.DeserializeObject<List<int>>(JsonListOfID); 
+0

對不起,但這不是和JSON.NET一樣,只是一種不同的方法?除此之外,我不知道從這種反序列化開始。 – LeCoffee 2013-04-11 18:38:27

+0

謝謝我將這個標記爲答案,因爲它是最有幫助的,即使它不回答我的問題... – LeCoffee 2013-04-12 15:53:44

+0

@ MrShaunh77我添加了一個答案,應該直接解決您的問題。看一看。 – 2013-04-15 20:25:12

0

如果您的Visual Studio 2012,你可以做編輯 - >粘貼特殊 - >將JSON粘貼爲使用JSON生成此類的類。雖然在這種情況下,這可能不會幫助你,因爲屬性名稱是動態的。雖然結構可能會有所幫助。另一個選擇可能是將響應解析爲JToken,然後使用linq來獲取數據。

public class Rootobject 
{ 
public Response response { get; set; } 
} 

public class Response 
{ 
public int success { get; set; } 
public int current_time { get; set; } 
public _35 _35 { get; set; } 
public _5002 _5002 { get; set; } 
public _5022 _5022 { get; set; } 
} 

public class _35 
{ 
public _11 _11 { get; set; } 
public _3 _3 { get; set; } 
} 

public class _11 
{ 
public _0 _0 { get; set; } 
} 

public class _0 
{ 
public Current current { get; set; } 
public Previous previous { get; set; } 
} 

public class Current 
{ 
public string currency { get; set; } 
public int value { get; set; } 
public int value_high { get; set; } 
public int date { get; set; } 
} 

public class Previous 
{ 
public string currency { get; set; } 
public int value { get; set; } 
public int value_high { get; set; } 
} 

public class _3 
{ 
public _01 _0 { get; set; } 
} 

public class _01 
{ 
public Current1 current { get; set; } 
} 

public class Current1 
{ 
public string currency { get; set; } 
public float value { get; set; } 
public float value_high { get; set; } 
} 

public class _5002 
{ 
public _6 _6 { get; set; } 
} 

public class _6 
{ 
public _02 _0 { get; set; } 
} 

public class _02 
{ 
public Current2 current { get; set; } 
} 

public class Current2 
{ 
public string currency { get; set; } 
public float value { get; set; } 
public float value_high { get; set; } 
public int date { get; set; } 
} 

public class _5022 
{ 
public _61 _6 { get; set; } 
} 

public class _61 
{ 
public _1 _1 { get; set; } 
} 

public class _1 
{ 
public Current3 current { get; set; } 
} 

public class Current3 
{ 
public string currency { get; set; } 
public float value { get; set; } 
public float value_high { get; set; } 
public int date { get; set; } 
} 
+0

謝謝,但http://json2csharp.com/更好,這不會像你所說的動態鍵那樣工作。 :/ – LeCoffee 2013-04-11 18:35:15

1

您在正確的軌道上IDictionary。這個JSON結構實際上是一堆嵌套字典。嘗試使你這樣的類:

public class Json1 
{ 
    public Json2 response { get; set; } 
} 
public class Json2 
{ 
    public int success { get; set; } 
    public string current_time { get; set; } 
    public IDictionary<int, IDictionary<int, IDictionary<int, Json5>>> prices { get; set; } 
} 
public class Json5 
{ 
    public Json6 current { get; set; } 
} 
public class Json6 
{ 
    public string currency { get; set; } 
    public string value { get; set; } 
    public string value_high { get; set; } 
} 

你可以反序列化這樣的:

Json1 obj = JsonConvert.DeserializeObject<Json1>(json); 

一旦你反序列化它,你可以在價值觀得到這樣的:

foreach (KeyValuePair<int, IDictionary<int, IDictionary<int, Json5>>> price in obj.response.prices) 
{ 
    Console.WriteLine("price index: " + price.Key); 
    foreach (KeyValuePair<int, IDictionary<int, Json5>> quality in price.Value) 
    { 
     Console.WriteLine("\t quality: " + quality.Key); 
     foreach (KeyValuePair<int, Json5> index in quality.Value) 
     { 
      Console.WriteLine("\t\t index: " + index.Key); 
      Console.WriteLine("\t\t\t currency: " + index.Value.current.currency); 
      Console.WriteLine("\t\t\t value: " + index.Value.current.value); 
      Console.WriteLine("\t\t\t value_high: " + index.Value.current.value_high); 
     } 
    } 
} 

以上的輸出(表明它的工作原理):

price index: 35 
     quality: 11 
       index: 0 
         currency: keys 
         value: 39 
         value_high: 41 
     quality: 3 
       index: 0 
         currency: metal 
         value: 0.33 
         value_high: 0.66 
price index: 5002 
     quality: 6 
       index: 0 
         currency: usd 
         value: 0.39 
         value_high: 0.42 
price index: 5022 
     quality: 6 
       index: 1 
         currency: metal 
         value: 1.33 
         value_high: 1.55