2016-05-06 234 views
1

我期待将下面的json字符串反序列化为3个不同的DataGrid。一个用于结果,一个用于提款,一个用于存款。任何人都有一个好的方法来做到这一点?任何帮助将非常感激。反序列化Json字符串.net

{ 
    "results": [ 
    { 
     "id": "51142254", 
     "tp_id": "!XP4D49X0CD123628", 
     "firstname": "Owner", 
     "lastname": "Operator", 
     "email": "", 
     "phone": "", 
     "enrolled": "1", 
     "balance": 247.54, 
     "fleet": "Test Express", 
     "deposits": [ 
     { 
      "id": "184022380", 
      "date": "2016-02-17", 
      "amount": "200.00", 
      "transID": "135246", 
      "memo": "Scheduled Deposit", 
      "status": "Cleared" 
     }, 
     { 
      "id": "184022383", 
      "date": "2016-02-25", 
      "amount": "200.00", 
      "transID": "246357", 
      "memo": "Scheduled Deposit", 
      "status": "Cleared" 
     }, 
     { 
      "id": "184022386", 
      "date": "2016-03-02", 
      "amount": "200.00", 
      "transID": "975468", 
      "memo": "Scheduled Deposit", 
      "status": "Cleared" 
     } 
     ], 
     "withdrawals": [ 
     { 
      "id": "184026949", 
      "date": "2016-03-09", 
      "amount": "352.46", 
      "transID": "395920", 
      "memo": "Invoice\r\n\r\n100234", 
      "status": "Cleared" 
     } 
     ] 
    }, 
    { 
     "id": "51142326", 
     "tp_id": "!XP4D49X7CD123612", 
     "firstname": "Owner", 
     "lastname": "Operator", 
     "email": "", 
     "phone": "", 
     "enrolled": "1", 
     "balance": 0, 
     "fleet": "Test\r\nExpress", 
     "deposits": [], 
     "withdrawals": [] 
    } 
    ] 
} 

当我去json2chsarp.com这是什么为我的类生成。我假设存款和取款部分没有出现,因为这里没有列出子节点。这应该如何正确完成?

public class Result 
{ 
    public string id { get; set; } 
    public string tp_id { get; set; } 
    public string firstname { get; set; } 
    public string lastname { get; set; } 
    public string email { get; set; } 
    public string phone { get; set; } 
    public string enrolled { get; set; } 
    public double balance { get; set; } 
    public string fleet { get; set; } 
    public List<object> deposits { get; set; } 
    public List<object> withdrawals { get; set; } 
} 

public class RootObject 
{ 
    public List<Result> results { get; set; } 
} 
+0

我的第一个想法是使用XML作为中间步骤。将JSON反序列化为XML非常简单,然后将这些数据用于构建数据网格。 –

+0

反序列化为对象集合,并将对象集合绑定到网格。有很多关于将JSON反序列化为对象模型的教程。 – DVK

+1

@ Prof.Bear为什么在世界上你会那样做....在XML中没有任何东西比json.net更有帮助 – Wobbles

回答

0
public class Deposite 
{ 
    public int id { get; set; } 
    public date date { get; set; } 
    public double amount { get; set; } 
    public int transID { get; set; } 
    public string Memo { get; set; } 
    public string status { get; set; } 
} 

public class Withdrawal 
{ 
    public int id { get; set; } 
    public date date { get; set; } 
    public double amount { get; set; } 
    public int transID { get; set; } 
    public string Memo { get; set; } 
    public string status { get; set; } 
} 

public class results 
{ 
    public int id { get; set; } 
    public int tp_id{ get; set; } 
    public string firstname { get; set; } 
    public string lastname { get; set; } 
    public string email { get; set; } 
    public string phone { get; set; } 
    public string enrolled { get; set; } 
    public string balance { get; set; } 
    public string fleet { get; set; } 
    public Deposite[] deposite { get; set; } 
    public Withdrawal[] withdrawal { get; set; } 
} 

public class opt 
{ 
    public results[] response { get; set; } 
} 

using System.Web.Script.Serialization; 

JavaScriptSerializer objJS = new JavaScriptSerializer(); 
opt objopt = new opt(); 
objopt = objJS .Deserialize<opt >("Your String"); 
+0

这对结果部分非常有用。我怎么能用这个来提取或存款? – Steve

+0

嗨史蒂夫,试试上面的代码,这一定会帮助你。 –

+0

谢谢!我认为我们正在接近但由于某种原因仍然没有出现。只有对象变量是m_response和响应。我还想补充我使用的是vb.net,所以我所有的代码转换为vb – Steve

1

您必须创建一个类结果并定义您的JSON的每个属性。 ,你也必须定义一个类存款取款,并把你的结果类的属性列表和列表。然后你可以使用这个

var results = new JavaScriptSerializer().Deserialize<List<results>>(); 

希望这有助于

这之后,您可以使用您的对象来填补你的数据网格

+0

为了快速测试,我做了下面的代码。所有值回来为 “无” 昏暗jsonstring的String = syncClient.DownloadString(URL) 昏暗javaScriptSerializer作为新JavaScriptSerializer() 昏暗的P2停药= javaScriptSerializer.Deserialize(撤回)(jsonstring) TextBox1.Text = p2.amount – Steve

+0

你是否将相同的json字符串传递给你的所有赋值语句? – taquion

+0

json字符串在我原来的帖子中。我用http://json2csharp.com/创建我的课程。 – Steve

1

首先,我建议创建一个对象(以及随后的)直接映射到Json字符串中给出的对象和属性。

然后,您可以使用JsonConvert.DeserializeObject<T>("your json string here");其中T是您的新对象类型,可将其转换回新对象的实例。

不要忘记在班上使用Newtonsoft.Json

转到Newtonsoft's Website看看如何做到这一点/它是如何工作的。

我也要看看another useful answer,有类似的问题。

希望这会有所帮助。

1

Newtonsoft JSON library是处理JSON对象的绝佳选择。使用动态特性与JObject.Parse,你可以用它分析后拉离JSON对象中的数据(其中rawJson是你的JSON字符串):

dynamic jsonBody = JObject.Parse(rawJson); 
    dynamic results = jsonBody.results; 

通过结果数组循环,你可以抓住所有的字段和数据,你需要插入到你的数据网格:

foreach(dynamic curResult in results) 
    { 
     JArray deposits = (JArray)curResult.deposits; 
     JArray withdrawals = (JArray)curResult.withdrawals; 

     //To get column names and values for your first data grid, iterate over the properties within curResult record 
     JObject header = (JObject)curResult; 
     var headerObjects = header.Properties(). 
      Find(x => 
       !x.Name.Equals("deposits") || 
       !x.Name.Equals("withdrawals")); 
    } 

您可以使用存款数组中的记录和取款阵列中的每个结果来填充这些数据网格。

这只是这个库允许您迭代JSON文档的很多方法之一。我希望这是有帮助的。