【问题标题】:How can I extract the individual array members out of JSON.NET's JsonArray?如何从 JSON.NET 的 JsonArray 中提取单个数组成员?
【发布时间】:2013-10-23 22:56:28
【问题描述】:

我正在使用 HttpWebRequest 和 HttpWebResponse 从 WebAPI 方法获取 JSON。但是我需要序列化/反序列化/解析该数据。

本机 JavaScriptSerializer 已被权衡并发现不足。我尝试了 fastJSON,但它的文档非常缺乏;我拒绝了 Simple.JSON,因为它是 Beta 版,我不确定它是否支持 .NET 3.5 的 Compact Framework。我终于转向了来自 Isaacsoft 的可靠的旧 JSON.NET,但对于如何提取 Json 对象的片段部分感到困惑。

这是我目前所拥有的:

const string uri = "http://localhost:48614/api/departments";
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    var reader = new StreamReader(webResponse.GetResponseStream());
    string s = reader.ReadToEnd();
    MessageBox.Show(s);

    JsonArray depts = JsonConvert.DeserializeObject<JsonArray>(s);
    MessageBox.Show(string.Format("count is {0}", depts.Count)); // this is right; it shows 6
. . .

如上一条评论所示,我想要的数据正在进入部门,因为它显示的数字是正确的 - 有 6 个 JSON“记录”(数组成员?)在“ s" 是 messagebox.Shown()。

但是如何从这里开始呢?这段被注释掉的代码将讲述我向其中投掷网的一些方向的悲惨故事,四处乱窜,但到目前为止失败了:

//List<Department> ld = JsonConvert.SerializeObject(depts).to;
//foreach (JObject jso in depts)
//{
//    jso.Values()
//}
//object id, accountId, deptName;
//JToken id, accountId, deptName;
////foreach (JsonObject jso in depts)
////{
////    if (jso.TryGetValue("id", out id))
////    {
////        MessageBox.Show(id.ToString());
////    }
////}
//foreach (JObject jso in depts)
//{
//    if (jso.TryGetValue("id", id))
//    {
//        MessageBox.Show(id.ToString());
//    }
//}
//JsonObject dept = depts[0] as JsonObject;
//Department dept = depts[0] as Department;
//Department dept = depts[0].
//MessageBox.Show(string.Format("first record: id is {0}, accountId is {1}, deptName is {2}", dept.Id, dept.AccountId, dept.DeptName));
//int id = depts[0].
//string accountId = depts[0].AccountId;
//string deptName = depts[0].DeptName;

//MessageBox.Show(string.Format("accountId is {0}, deptName is {1}", accountId, deptName));

更新

响应布赖恩·罗杰斯查看 json 的请求,此代码:

var reader = new StreamReader(webResponse.GetResponseStream());
string s = reader.ReadToEnd();
MessageBox.Show(s);

...产生这个:

更新 2

这里是测试 JSON:

[{"Id":0,"AccountId":"7.0","DeptName":"Dept7"},{"Id":1,"AccountId":"8.0","DeptName":"Dept8" },{"Id":2,"AccountId":"9.0","DeptName":"Dept9"},{"Id":3,"AccountId":"10.0","DeptName":"Dept7"}, {"Id":4,"AccountId":"11.0","DeptName":"Dept7"},{"Id":5,"AccountId":"12.0","DeptName":"Dept8"}]

【问题讨论】:

  • 尝试转换为 IList
  • 你能发布你的 JSON 吗?
  • @jcwrequests:不确定您的建议。这是我尝试过的: //IList ij = JsonConvert.DeserializeObject(s); jso in depts) { jso. ? }
  • 请发布 JSON 文本,而不是截图。
  • @JeffMercado:好的,请参阅更新 2

标签: c# json.net httpwebresponse arrays jsonserializer


【解决方案1】:

我不确定您从哪里获得 JsonArray 类型,但 JSON.net 使用 JArray 来表示 JSON 数组。

要访问数组中的项目,只需将索引器与要获取的项目的索引一起使用。

然后对于每个对象,您几乎可以将它们视为字典并通过索引器按名称访问成员。

但是请注意,当您通过索引器访问任何内容时,您需要将值转换为适当的类型。访问成员的类型为JToken

var json = @"[
    { ""Id"":0, ""AccountId"":""7.0"",  ""DeptName"":""Dept7"" },
    { ""Id"":1, ""AccountId"":""8.0"",  ""DeptName"":""Dept8"" },
    { ""Id"":2, ""AccountId"":""9.0"",  ""DeptName"":""Dept9"" },
    { ""Id"":3, ""AccountId"":""10.0"", ""DeptName"":""Dept7"" },
    { ""Id"":4, ""AccountId"":""11.0"", ""DeptName"":""Dept7"" },
    { ""Id"":5, ""AccountId"":""12.0"", ""DeptName"":""Dept8"" }
]";
var arr = JsonConvert.DeserializeObject<JArray>(json);
// iterate through all the objects
foreach (JObject obj in arr)
{
    var id = (string)obj["Id"];
    var accountId = (double)obj["AccountId"];
    var departmentName = (string)obj["DeptName"];
    // do stuff
}
var second = (JObject)arr[1]; // or directly access the second object

如果您的目标是 .NET 4,您可以使用 dynamic 让事情变得更简单。

dynamic arr = JsonConvert.DeserializeObject(json);
foreach (dynamic obj in arr)
{
    string id = obj.Id;
    double accountId = obj.AccountId;
    string departmentName = obj.DeptName;
    // do stuff
}

【讨论】:

  • 谢谢;不幸的是,我们在这个项目中仅限于 .NET 3.5(仅从 .NET 1.1 移植)!
猜你喜欢
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
相关资源
最近更新 更多