尝试在C#中反序列化复杂的json文件

问题描述

我正在尝试在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",{ "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.applicationApplication的数组。您可以先获取subnet_ids,然后将该阵列转换为字符串,从而打印应用程序子网的阵列。

之所以看到JsonDeserializer.Application[] 是因为打印对象本身。当您这样做时,将得到对象类型的名称,而不是其中的值。>

Console.WriteLine(string.Join(",",vpcs.dev.subnets.application.Select(x => x.subnet_id)));

Select语句通过每个应用程序,并且仅返回subnet_id。只要有数组/列表,就可以使用select方法从列表中获取特定项,或者使用此方法创建新对象。

Documentation on 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());
}