2014-03-05 182 views
3

我在我的VB.Net上使用Newtonsoft.Json,並且遇到了json反序列化問題。Json Net層次結構類

這完全是一個小菜。一個簡單的階級層次結構,我可以做到這一點......但像下面這樣更復雜,完全是一個白癡。

有人可以幫助我從這個JSON構建序列化類層次?

{ 
    "user": { 
     "user_id": 123456, 
     "total": 100, 
     "rewards": 0 
    }, 
    "workers": { 
     "1": { 
      "worker_name": "rainfall_home", 
      "rate": 0, 
      "shares": 0 
     }, 
     "2": { 
      "worker_name": "rainfall_office", 
      "rate": 7358.71, 
      "shares": 96564 
     }, 
     "3": { 
      "worker_name": "rainfall_rig", 
      "rate": 0, 
      "shares": 77208 
     }, 
     "4": { 
      "worker_name": "rainfall_s11", 
      "rate": 178365.22, 
      "shares": 3760356 
     }, 
     "5": { 
      "worker_name": "rainfall_s12", 
      "rate": 196537.7, 
      "shares": 4152710 
     } 
    }, 
    "total": { 
     "total_user": 5, 
     "record_date": 2 
    } 
} 

而我如何得到工人的長度(總計)和循環,所以我可以得到每個工人的記錄?由於工人可以不斷加起來。

在此先感謝。

回答

0

由於您試圖獲得工作人員總數,並且您說工作人員可以繼續累加,那麼我會建議您重新構建JSON(如果您有修改範圍),以便可以管理工作人員作爲array,而不是每次需要將新工作人員添加到JSON時將其添加爲object。請參考下面的建議JSON:

{ 
    "user": { 
     "user_id": 123456, 
     "total": 100, 
     "rewards": 0 
    }, 
    "workers": [ 
     { 
      "worker_name": "rainfall_home", 
      "rate": 0, 
      "shares": 0 
     }, 
     { 
      "worker_name": "rainfall_office", 
      "rate": 7358.71, 
      "shares": 96564 
     }, 
     { 
      "worker_name": "rainfall_rig", 
      "rate": 0, 
      "shares": 77208 
     }, 
     { 
      "worker_name": "rainfall_s11", 
      "rate": 178365.22, 
      "shares": 3760356 
     }, 
     { 
      "worker_name": "rainfall_s12", 
      "rate": 196537.7, 
      "shares": 4152710 
     } 
    ], 
    "total": { 
     "total_user": 5, 
     "record_date": 2 
    } 
} 

現在新的分類如下:

public class RootObject 
{ 
    public User user { get; set; } 
    public List<Worker> workers { get; set; } 
    public Total total { get; set; } 
} 

public class User 
{ 
    public int user_id { get; set; } 
    public int total { get; set; } 
    public int rewards { get; set; } 
} 

public class Worker 
{ 
    public string worker_name { get; set; } 
    public double rate { get; set; } 
    public int shares { get; set; } 
} 

public class Total 
{ 
    public int total_user { get; set; } 
    public int record_date { get; set; } 
} 

現在你可以很容易地遍歷每個工人得到一個人的詳細資料,如下面:

string json = "YOUR_JSON_STRING"; 
RootObject rootObject = JsonConvert.DeserializeObject<RootObject> (json); 

Console.WriteLine("Total no. of workers: {0}", rootObject.workers.Count); 

foreach (Worker worker in rootObject.workers) 
{ 
    Console.WriteLine("Name: {0}, Rate: {1}, Shares: {2}", worker.worker_name, worker.rate.ToString("F2", CultureInfo.InvariantCulture), worker.shares); 
} 
+0

的JSON數據是從外部API,所以我不能更改格式。 對於工作人員的一部分,它給了我一個錯誤... 它說了一些關於「該類型需要JSON數組..正確反序列化」。 任何想法??? –

+0

我已經發布了另一個答案來滿足您的需求。請看看[that](http://stackoverflow.com/a/22195247/1977104)! –

0

如果您的JSON數據來自外部API,那麼您可以按如下方式進行分類:

public class RootObject 
{ 
    public User user { get; set; } 
    public Dictionary<string, Worker> workers { get; set; } 
    public Total total { get; set; } 
} 

public class User 
{ 
    public int user_id { get; set; } 
    public int total { get; set; } 
    public int rewards { get; set; } 
} 

public class Worker 
{ 
    public string worker_name { get; set; } 
    public double rate { get; set; } 
    public int shares { get; set; } 
} 

public class Total 
{ 
    public int total_user { get; set; } 
    public int record_date { get; set; } 
} 

現在你可以很容易地遍歷每個工人得到一個人的詳細資料,如下面:

string json = "YOUR_JSON_STRING"; 
RootObject rootObject = JsonConvert.DeserializeObject<RootObject> (json); 

Console.WriteLine("Total no. of workers: {0}", rootObject.workers.Count); 

foreach (KeyValuePair<string, Worker> worker in rootObject.workers) 
{ 
    Console.WriteLine("Name: {0}, Rate: {1}, Shares: {2}", worker.Value.worker_name, worker.Value.rate.ToString("F2", CultureInfo.InvariantCulture), worker.Value.shares); 
} 
+0

它工作嗎?或任何問題... –

+0

我使用PHP來代替它,這給了我更多的靈活性,這json thingy。 :P –

+0

很高興知道! –