【问题标题】:Trying to deserialize a complex json file in c#试图在c#中反序列化一个复杂的json文件
【发布时间】:2020-08-13 13:23:32
【问题描述】:

我正在尝试反序列化 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[] 作为输出

【问题讨论】:

  • 代码Console.WriteLine(vpcs.dev.subnets.application);其实就是Console.WriteLine(vpcs.dev.subnets.application.ToString());,所以如果要查看数组内容就应该迭代元素。或者只是将整个对象序列化回 JSON 并打印出来。

标签: c# .net json data-structures json-deserialization


【解决方案1】:

这是因为vpcs.dev.subnets.applicationApplication 的数组。您可以通过首先获取 subnet_ids 然后将该数组转换为字符串来打印应用程序子网数组。

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

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

Select 语句遍历每个应用程序并仅返回子网 ID。每当您有一个数组/列表时,您都可以使用 select 方法从列表中获取特定项目或使用它创建新对象。

Documentation on Select

【讨论】:

  • 非常感谢!这是有效的,但如果你能解释它是如何工作的,那就太好了Select(x =&gt; x.subnet_id))@Jawad
  • @stephencarvalho 添加了指向有关 Select 语句如何工作的文档的链接。
  • 谢谢!很好理解。如果你也可以请投票这个问题,这样我就可以提高我在 stackoverflow 上的声誉。
【解决方案2】:

这是因为您尝试在一行中打印一个数组,您可以尝试执行以下操作:

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

【讨论】:

  • 这两种方法仍然返回相同的东西,即 JsonDeserializer.Application
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
相关资源
最近更新 更多