Json C# 多维数组访问
Posted
技术标签:
【中文标题】Json C# 多维数组访问【英文标题】:Json C# multidimensional array access 【发布时间】:2020-02-01 19:21:08 【问题描述】:程序的重点是找出一个角色参与过的电影总数。
我正在尝试访问 Newtonsoft.Json.Linq.JArray
类型的对象来计算多维数组的长度。
Json 数组:
"count": 1,
"next": null,
"previous": null,
"results": [
"name": "Luke Skywalker",
"height": "172",
"mass": "77",
"hair_color": "blond",
"skin_color": "fair",
"eye_color": "blue",
"birth_year": "19BBY",
"gender": "male",
"homeworld": "descriptiontext",
"films": [
"linkapifilms1",
"linkapifilms2",
"linkapifilms3",
"linkapifilms6",
"linkapifilms7"
],
"species": [],
"vehicles": [
"linapivehicles14",
"linapivehicles30"
],
"starships": [
"linapistarships12",
"linapistarships22"
],
"created": "2014-12-09T13:50:51.644000Z",
"edited": "2014-12-20T21:17:56.891000Z",
"url": "linkapipeople1"
]
我正在尝试访问 "films":
以计算数组的长度并将其存储/显示在 int 变量中。
我的代码:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class Solution
static void Main()
Console.WriteLine("Number of films: " + Run("Luke Skywalker"));
Console.ReadKey();
static public int Run(string character)
int numberOfFilms = 0;
Task<string> result = GetResponseString(character);
var jsonResult = result.Result;
dynamic dynamicResultObject = JsonConvert.DeserializeObject(jsonResult);
JArray x = dynamicResultObject.results;
//Find length of "films" code insert//
Console.WriteLine(character);
return numberOfFilms;
static public async Task<string> GetResponseString(string character)
var httpClient = new HttpClient();
var response = await httpClient.GetAsync("linktoapi/api/people/?search=" + character);
var contents = await response.Content.ReadAsStringAsync();
return contents;
我可以用dynamicResultObject.results;
访问数组的第一行
所以问题是我如何访问电影,即在结果中并找到长度?
编辑:我知道这可能不是编写此程序的最佳方式,但是,是否不能使用当前代码访问主数组的子数组?
【问题讨论】:
var jsonResult = result.Result;
这是个坏主意。你应该是await
ing GetResponseString
How can I parse JSON with C#?的可能重复
我建议您按照this answer 中的过程进行操作,您将获得易于使用的强类型对象。
【参考方案1】:
首先,我建议不要使用dynamic
,因为它只会让你头疼。如果您要使用JObjects
和JArrays
,那么您最好直接使用这些类型。编译器将能够更早地检测到错误,并且您将在 Visual Studio 中获得 Intellisense 帮助。所以,像这样解析你的 JSON:
JObject rootObject = JObject.Parse(jsonResult);
从中您可以获得结果数组。 (您在代码中调用了这个数组x
,但我认为resultsArray
是一个更具描述性的变量名称):
JArray resultsArray = (JArray)rootObject["results"];
像任何数组一样,如果您想获取特定元素,您需要使用它的索引。我们可以像这样获取数组的第一个元素(即包含 Luke Skywalker 数据的对象):
JObject characterObject = (JObject)resultsArray[0];
从那里,您可以获得films
属性,它也是JArray
:
JArray filmsArray = (JArray)characterObject["films"];
要获取JArray
的长度,请使用Count
属性:
numberOfFilms = filmsArray.Count;
小提琴:https://dotnetfiddle.net/iFAWB4
既然您知道如何逐步深入了解对象和数组,我将向您展示一个小捷径,SelectToken()
方法。此方法允许您指定“路径”以获取特定的JToken
(JObject
和JArray
都是JTokens
的类型)。因此,在解析完 JSON 之后,您可以像这样直接获取 films
数组:
JArray filmsArray = (JArray)rootObject.SelectToken("results[0].films");
然后像以前一样获取它的计数。
小提琴:https://dotnetfiddle.net/zOdSFs
【讨论】:
哇,谢谢!认真感谢您的答案的逐步细分,缓解头痛。 很高兴能帮上忙!以上是关于Json C# 多维数组访问的主要内容,如果未能解决你的问题,请参考以下文章
如何在 javascript 中访问多维 PHP 数组作为 json 编码的变体?