2014-03-05 183 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

很高兴知道! –