【问题标题】:How can I deserialize a JSON array into a native .net data structure?如何将 JSON 数组反序列化为原生 .net 数据结构?
【发布时间】:2015-01-23 23:51:02
【问题描述】:

我的 JSON 看起来像这样:

{
  "records": [{
    "skills": "",
    "u_past_assignment_groups": "",
    "urgency": "3",
    "correlation_id": "",
    "u_program_name": "",
    "u_software_name": "",
    "group_list": ""
  }]
}

(这是一个截断的版本。)但关键是它是一个键值对的单元素数组。

在原生 JavaScript 中,使用 JSON.parseeval 将这个 JSON 转换为实际的键/值对数组是一个非常简单的步骤,但是在 .Net 中我无法弄清楚如何反序列化它JSON 变成任何有意义的东西。我已经尝试了JavaScriptSerializer.DeserializeJavaScriptSerializer.DeserializeObject 的所有排列组合。无论我尝试什么,我都会继续收到一些关于无法反序列化或无法转换的错误。有人可以看看这段代码 sn-p 并告诉我如何(在本机 .Net 中)我可以将其反序列化为键/值对的列表或数组吗?

我必须创建自己的对象来存储这些数据吗?我的意思是,我不想这样做。看起来它应该很容易符合原生 .net 数据结构。

//process response
Stream respStream = resp.GetResponseStream();
StreamReader respReader = new StreamReader(respStream);
string response = respReader.ReadToEnd();
respStream.Close();
JavaScriptSerializer jsDes = new JavaScriptSerializer();

//***This is the part I can't figure out.***
var objResp = jsDes.DeserializeObject(response);
Dictionary<string, string>[] dicResp = (Dictionary<string, string>[])objResp;
//******************************************

pOutput.InnerText = "Incident Number: " + dicResp[0]["key"];

【问题讨论】:

  • 这有点令人困惑,但请不要将代码 sn-ps 仅用于代码块。为此使用代码块。代码 sn-ps 用于可在浏览器中运行的代码。
  • 我明白了。道歉。我读了这个论坛好一点,但很少发帖。我会一直记住的。

标签: javascript c# asp.net json


【解决方案1】:

您没有说是否可以使用第三方库,但我认为 Json.NET 比 JavascriptSerializer 更好(更多功能和性能)。您可以通过以下方式完成您想要的:

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(response);

更多关于 Json.Net:http://james.newtonking.com/json

【讨论】:

  • 我在寻找解决方案的过程中多次看到这个库被引用,但最终我想学习如何使用本机 .net 对象来做到这一点。我在问题的括号中提到了这一点。最终,我确实下载了这个库,并对它的性能感到满意。感谢您花时间回答我的问题。
【解决方案2】:

这应该可以。我将您的示例粘贴到 input.txt 文件中。

string json = File.ReadAllText("input.txt");
JavaScriptSerializer jsDes = new JavaScriptSerializer();
Dictionary<string, object> objResp = (Dictionary<string, object>)jsDes.DeserializeObject(json);
Object[] records =(Object[])objResp["records"];
Dictionary<string,object> results= (Dictionary<string,object>) records[0];
Console.WriteLine(result["urgency"]);

我认为由于您的 JSON 结构,阅读起来很复杂。您将“记录”作为空数组中的第一个条目(使用 {} 打开和关闭 JSON)。 此外,在记录内部,您还有另一个未索引的数组,其第一个条目是包含您的键/值对的实际字典。

【讨论】:

  • 是的。不幸的是,就我而言,我无法控制 JSON 的格式。你的解决方案奏效了。 (必须在最后一行的“结果”中添加“s”以使变量匹配)。由于我要求提供本地 .net 解决方案,而您给了我一个,因此我将其标记为答案。最后,我从 codeplex 下载了 JSON.net 库。它似乎更加强大。感谢您花时间回答我的问题。
  • 我遵守您使用图书馆的决定。这是更有效和更好的做法。不客气!
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多