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; 这是个坏主意。你应该是awaiting GetResponseString How can I parse JSON with C#?的可能重复 我建议您按照this answer 中的过程进行操作,您将获得易于使用的强类型对象。 【参考方案1】:

首先,我建议不要使用dynamic,因为它只会让你头疼。如果您要使用JObjectsJArrays,那么您最好直接使用这些类型。编译器将能够更早地检测到错误,并且您将在 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() 方法。此方法允许您指定“路径”以获取特定的JTokenJObjectJArray 都是JTokens 的类型)。因此,在解析完 JSON 之后,您可以像这样直接获取 films 数组:

JArray filmsArray = (JArray)rootObject.SelectToken("results[0].films");

然后像以前一样获取它的计数。

小提琴:https://dotnetfiddle.net/zOdSFs

【讨论】:

哇,谢谢!认真感谢您的答案的逐步细分,缓解头痛。 很高兴能帮上忙!

以上是关于Json C# 多维数组访问的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 访问多维 JSON 数组中的数据

Ajax以JSON访问从PHP返回的多维数组

Java 和 C# 中的多维数组

如何在 javascript 中访问多维 PHP 数组作为 json 编码的变体?

如何循环访问和访问多维和关联数组中的各种元素? PHP,JSON 或 XML

多维数组和 C# 中的数组数组有啥区别?