如何在 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; }
}
````
我知道以前可能有人问过这种类型的问题,但是当我尝试时,它并没有奏效。我刚开始在 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; }
}
````