簡體   English   中英

試圖反序列化 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; }
    }
}

Output

Hello World!
vpc-us-east-1-it-dev
JsonDeserializer.Application[]

我想用 prod.subnets 打印應用程序子網列表,但我沒有得到返回的值,而是將 JsonDeserializer.Application[] 作為 output

那是因為vpcs.dev.subnets.application是一個Application數組。 您可以通過首先獲取 subnet_ids 然后將該數組轉換為字符串來打印應用程序子網數組。

您看到JsonDeserializer.Application[]的原因是因為您打印 object 本身。當您這樣做時,您會得到 object 類型的名稱,而不是其中的值。

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

Select語句遍歷每個應用程序並僅返回子網 ID。 每當您有一個數組/列表時,您都可以使用 select 方法從列表中獲取特定項目,或者也可以使用它創建新的 object。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM