如何在 C# 中反序列化嵌套 JSON

How to deserialize nested JSON in C#

我知道以前可能有人问过这种类型的问题,但是当我尝试时,它并没有奏效。我刚开始在 C# 中使用 jsons。所以我有一个 JSON 文件(文件中的示例比真实文件中的示例短),我想从中获取值。我需要的值在 'languages' 数组中。

从网站上的数组中获取数据有一个很好的解决方案:
https://www.newtonsoft.com/json/help/html/DeserializeDataSet.htm

但是,我有一个问题,因为有一个 'Result' 属性,我不知道如何通过它。 json ('Headers') 顶部还有很多属性,我不需要,但我认为我仍然需要将它们包含在我的代码中?如果有人可以向我发送一些提示或有关如何执行此操作的解决方案,那将非常有帮助。还会有一个不完整的代码示例,它会给出错误。此外,如果你们中的任何一个人也可以在 YouTube 或网站上回复一段关于 Json.net 的好视频,除了官方文档,那就太棒了。谢谢

Json:

{
  "StatusCode": 200,
  "Headers": {
    "X-XSS-Protection": "1; mode=block",
    "X-Content-Type-Options": "nosniff",
    "Content-Security-Policy": "default-src 'none'",
    "Cache-Control": "no-store, no-cache",
    "Pragma": "no-cache",
    "Strict-Transport-Security": "max-age=31536000; includeSubDomains;",
    "x-dp-watson-tran-id": "0cf1366a-5bd0-4210-a291-93a30ea0ac62",
    "X-Request-ID": "0cf1366a-5bd0-4210-a291-93a30ea0ac62",
    "x-global-transaction-id": "0cf1366a-5bd0-4210-a291-93a30ea0ac62",
    "Server": "watson-gateway",
    "X-EdgeConnect-MidMile-RTT": "5",
    "X-EdgeConnect-Origin-MEX-Latency": "92",
    "Date": "Wed, 25 Aug 2021 13:21:23 GMT",
    "Connection": "keep-alive"
  },
  "Result": {
    "languages": [
      {
        "language": "af",
        "language_name": "Afrikaans",
        "native_language_name": "Afrikaans",
        "country_code": "ZA",
        "words_separated": true,
        "direction": "left_to_right",
        "supported_as_source": false,
        "supported_as_target": false,
        "identifiable": true
      },
      {
        "language": "ar",
        "language_name": "Arabic",
        "native_language_name": "العربية",
        "country_code": "AR",
        "words_separated": true,
        "direction": "right_to_left",
        "supported_as_source": true,
        "supported_as_target": true,
        "identifiable": true
      },
      {
        "language": "az",
        "language_name": "Azerbaijani",
        "native_language_name": "آذربایجان دیلی",
        "country_code": "AZ",
        "words_separated": true,
        "direction": "right_to_left",
        "supported_as_source": false,
        "supported_as_target": false,
        "identifiable": true
      }
    ]
}

我的不完整代码:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace WorkingWithFiles
{
    class FullJson
    {
        public int StatusCode { get; set; }
        public Dictionary<string, List<Headers>> Headers { get; set; }
        public Dictionary<string, List<Languages>> Result { get; set; }

    }

    class Headers
    {
        public string xXssProtection { get; set; }
        public string xContentTypeOptions { get; set; }
        public string contentTypeOptions { get; set; }
        public string cacheControl { get; set; }
        public string pragma { get; set; }
        public string strictTransportSecurity { get; set; }
        public string xDpWatsonTranId { get; set; }
        public string xRequestId { get; set; }
        public string xGlobalTransactionId { get; set; }
        public string server { get; set; }
        public string xEdgeConnectMidMileRTT { get; set; }
        public string xEdgeConnectOriginMEXLatency { get; set; }
        public string date { get; set; }
        public string connection { get; set; }
    }

    class Languages
    {

    }

class Program
    {
        static void Main(string[] args)
        {
            string root = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            string path = root + @"\SubtitleTranslator\LanguagesList.json";

            FullJson fullJson = JsonConvert.DeserializeObject<FullJson>(File.ReadAllText(path));
            Console.WriteLine("Status code: " + fullJson.StatusCode);





        }
    }
}

如果您只需要 languages 数组的内容,则使用 Json.NET 的 LINQ to JSON 功能:

class LangInfo {
    public string language { get; set; }
    public string language_name { get; set; }
    public string native_language_name { get; set; }
    ...
}
var langs = JObject.Parse(json)["Result"]["languages"].Children()
    .Select(token => token.ToObject<LangInfo>()).ToList();

所有代码均使用 VS2019 进行测试并正常工作。

最简单的方法是

var root =Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var path = root + @"\SubtitleTranslator\LanguagesList.json";
 var json = File.ReadAllText(path);
var jsonDeserialized = JsonConvert.DeserializeObject<Root>(json);
List<Language> languages = null;
if( jsonDeserialized.StatusCode== 200) languages=jsonDeserialized.Result.languages;

或者如果您不需要除语言之外的任何数据,请尝试此代码

var languages= JObject.Parse(json)["Result"]["languages"].ToObject<Language[]>();

在这种情况下,您只需要语言 class

输出(在两种情况下)

[{"language":"af","language_name":"Afrikaans","native_language_name":"Afrikaans","country_code":"ZA","words_separated":true,"direction":"left_to_right","supported_as_source":false,"supported_as_target":false,"identifiable":true},
{"language":"ar","language_name":"Arabic","native_language_name":"العربية","country_code":"AR","words_separated":true,"direction":"right_to_left","supported_as_source":true,"supported_as_target":true,"identifiable":true},
{"language":"az","language_name":"Azerbaijani","native_language_name":"آذربایجان دیلی","country_code":"AZ","words_separated":true,"direction":"right_to_left","supported_as_source":false,"supported_as_target":false,"identifiable":true}]

更新

您可以使用 Console.WriteLine

进行测试
foreach (var lg in languages)
{
Console.WriteLine($"Language Name: {lg.native_language_name}, Coutry Code: {lg.country_code}");
        
}

语言class

public class Language
{
    public string language { get; set; }
    public string language_name { get; set; }
    public string native_language_name { get; set; }
    public string country_code { get; set; }
    public bool words_separated { get; set; }
    public string direction { get; set; }
    public bool supported_as_source { get; set; }
    public bool supported_as_target { get; set; }
    public bool identifiable { get; set; }
}

另外 classes(如果需要)

public class Root
{
    public int StatusCode { get; set; }
    public Headers Headers { get; set; }
    public Result Result { get; set; }
}
public class Headers
{
    [JsonProperty("X-XSS-Protection")]
    public string XXSSProtection { get; set; }

    [JsonProperty("X-Content-Type-Options")]
    public string XContentTypeOptions { get; set; }

    [JsonProperty("Content-Security-Policy")]
    public string ContentSecurityPolicy { get; set; }

    [JsonProperty("Cache-Control")]
    public string CacheControl { get; set; }
    public string Pragma { get; set; }

    [JsonProperty("Strict-Transport-Security")]
    public string StrictTransportSecurity { get; set; }

    [JsonProperty("x-dp-watson-tran-id")]
    public string XDpWatsonTranId { get; set; }

    [JsonProperty("X-Request-ID")]
    public string XRequestID { get; set; }

    [JsonProperty("x-global-transaction-id")]
    public string XGlobalTransactionId { get; set; }
    public string Server { get; set; }

    [JsonProperty("X-EdgeConnect-MidMile-RTT")]
    public string XEdgeConnectMidMileRTT { get; set; }

    [JsonProperty("X-EdgeConnect-Origin-MEX-Latency")]
    public string XEdgeConnectOriginMEXLatency { get; set; }
    public string Date { get; set; }
    public string Connection { get; set; }
}


public class Result
{
    public List<Language> languages { get; set; }
}
````