尝试在 C# 中反序列化一个复杂的 json 文件
Trying to deserialize a complex json file in c#
我正在尝试在 c# 中反序列化一个 json 文件并使用键打印每个单独值的值,但是对于作为列表的 json 值,我是无法打印所需的值。
Json 文件:
{
"prod": {
"vpc_name": "vpc-us-east-1-it-prod",
"subnets": {
"application": [ "subnet-1234", "subnet-1345" ],
"data": [ "subnet-64t3", "subnet-f321" ],
"edge": [ "subnet-1ff3", "subnet-134g" ]
}
},
"dev": {
"vpc_name": "vpc-us-east-1-it-dev",
"subnets": {
"application": [
{ "subnet_id": "subnet-2345tf", "az": "us-east-1a" },
{ "subnet_id": "subnet-143f1", "az": "us-east-1b" }
],
"data": [
{ "subnet_id": "subnet-134f", "az": "us-east-1b" },
{ "subnet_id": "subnet-1324", "az": "us-east-1a" }
],
"edge": [
{ "subnet_id": "subnet-123434", "az": "us-east-1a" },
{ "subnet_id": "subnet-123fg", "az": "us-east-1b" }
]
}
}
}
C#代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
namespace JsonDeserializer
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
string jsonString = File.ReadAllText(@"C:/Users/Stephen.Carvalho/source\repos/JsonDeserializer/JsonDeserializer/vpc_stack.json");
Rootobject vpcs = JsonSerializer.Deserialize<Rootobject>(jsonString);
Console.WriteLine(vpcs.dev.vpc_name);
Console.WriteLine(vpcs.dev.subnets.application);
}
}
public class Rootobject
{
public Prod prod { get; set; }
public Dev dev { get; set; }
}
public class Prod
{
public string vpc_name { get; set; }
public Subnets subnets { get; set; }
}
public class Subnets
{
public string[] application { get; set; }
public string[] data { get; set; }
public string[] edge { get; set; }
}
public class Dev
{
public string vpc_name { get; set; }
public Subnets1 subnets { get; set; }
}
public class Subnets1
{
public Application[] application { get; set; }
public Datum[] data { get; set; }
public Edge[] edge { get; set; }
}
public class Application
{
public string subnet_id { get; set; }
public string az0885b3b66d { get; set; }
public string az { get; set; }
}
public class Datum
{
public string subnet_id { get; set; }
public string az { get; set; }
}
public class Edge
{
public string subnet_id { get; set; }
public string az { get; set; }
}
}
输出
Hello World!
vpc-us-east-1-it-dev
JsonDeserializer.Application[]
我想用 prod.subnets 打印应用程序子网列表,但我没有得到返回值,而是得到 JsonDeserializer.Application[] 作为输出
那是因为vpcs.dev.subnets.application
是Application
的数组。您可以通过首先获取 subnet_ids 然后将该数组转换为字符串来打印应用程序子网数组。
你看到 JsonDeserializer.Application[]
的原因是因为你打印了对象本身。当你这样做时,你得到的是对象类型的名称而不是里面的值
Console.WriteLine(string.Join(", ", vpcs.dev.subnets.application.Select(x => x.subnet_id)));
Select
语句遍历每个应用程序,returns 仅遍历 subnet_id。无论何时你有一个数组/列表,你都可以使用 select 方法从列表中获取特定的项目或者用它创建新的对象。
这是因为您试图在一行中打印一个数组,所以您可以尝试这样做:
Array.ForEach(vpcs.dev.subnets.application, Console.WriteLine);
或将其解析为列表并打印出来
vpcs.dev.subnets.application.ToList().ForEach(i => Console.WriteLine(i.ToString()));
或者您也可以尝试在 foreach 中执行此操作:
foreach(var item in vpcs.dev.subnets.application)
{
Console.WriteLine(item.ToString());
}
我正在尝试在 c# 中反序列化一个 json 文件并使用键打印每个单独值的值,但是对于作为列表的 json 值,我是无法打印所需的值。 Json 文件:
{
"prod": {
"vpc_name": "vpc-us-east-1-it-prod",
"subnets": {
"application": [ "subnet-1234", "subnet-1345" ],
"data": [ "subnet-64t3", "subnet-f321" ],
"edge": [ "subnet-1ff3", "subnet-134g" ]
}
},
"dev": {
"vpc_name": "vpc-us-east-1-it-dev",
"subnets": {
"application": [
{ "subnet_id": "subnet-2345tf", "az": "us-east-1a" },
{ "subnet_id": "subnet-143f1", "az": "us-east-1b" }
],
"data": [
{ "subnet_id": "subnet-134f", "az": "us-east-1b" },
{ "subnet_id": "subnet-1324", "az": "us-east-1a" }
],
"edge": [
{ "subnet_id": "subnet-123434", "az": "us-east-1a" },
{ "subnet_id": "subnet-123fg", "az": "us-east-1b" }
]
}
}
}
C#代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
namespace JsonDeserializer
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
string jsonString = File.ReadAllText(@"C:/Users/Stephen.Carvalho/source\repos/JsonDeserializer/JsonDeserializer/vpc_stack.json");
Rootobject vpcs = JsonSerializer.Deserialize<Rootobject>(jsonString);
Console.WriteLine(vpcs.dev.vpc_name);
Console.WriteLine(vpcs.dev.subnets.application);
}
}
public class Rootobject
{
public Prod prod { get; set; }
public Dev dev { get; set; }
}
public class Prod
{
public string vpc_name { get; set; }
public Subnets subnets { get; set; }
}
public class Subnets
{
public string[] application { get; set; }
public string[] data { get; set; }
public string[] edge { get; set; }
}
public class Dev
{
public string vpc_name { get; set; }
public Subnets1 subnets { get; set; }
}
public class Subnets1
{
public Application[] application { get; set; }
public Datum[] data { get; set; }
public Edge[] edge { get; set; }
}
public class Application
{
public string subnet_id { get; set; }
public string az0885b3b66d { get; set; }
public string az { get; set; }
}
public class Datum
{
public string subnet_id { get; set; }
public string az { get; set; }
}
public class Edge
{
public string subnet_id { get; set; }
public string az { get; set; }
}
}
输出
Hello World!
vpc-us-east-1-it-dev
JsonDeserializer.Application[]
我想用 prod.subnets 打印应用程序子网列表,但我没有得到返回值,而是得到 JsonDeserializer.Application[] 作为输出
那是因为vpcs.dev.subnets.application
是Application
的数组。您可以通过首先获取 subnet_ids 然后将该数组转换为字符串来打印应用程序子网数组。
你看到 JsonDeserializer.Application[]
的原因是因为你打印了对象本身。当你这样做时,你得到的是对象类型的名称而不是里面的值
Console.WriteLine(string.Join(", ", vpcs.dev.subnets.application.Select(x => x.subnet_id)));
Select
语句遍历每个应用程序,returns 仅遍历 subnet_id。无论何时你有一个数组/列表,你都可以使用 select 方法从列表中获取特定的项目或者用它创建新的对象。
这是因为您试图在一行中打印一个数组,所以您可以尝试这样做:
Array.ForEach(vpcs.dev.subnets.application, Console.WriteLine);
或将其解析为列表并打印出来
vpcs.dev.subnets.application.ToList().ForEach(i => Console.WriteLine(i.ToString()));
或者您也可以尝试在 foreach 中执行此操作:
foreach(var item in vpcs.dev.subnets.application)
{
Console.WriteLine(item.ToString());
}