将JSON输出转换为表格格式

时间:2018-12-14 23:39:03

标签: c# json.net

我正在尝试从JSON文件中获取解析的值,并将其转换为行。我已经整周尝试了,但仍然无法解决。


我当前的输出如下:

a: 1
b: 2
c: 3
a: 1a
b: 2a
c: 3a
a: 1b
b: 2b
c: 3b

我希望输出是这样,但找不到解决方案。

a   b   c 
1   2   3
1a  2a  3a
1b  2g  3b

using System;
using Newtonsoft.Json;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        string json = 
        @"{
            'somethingone': 'abc',
            'somethingtwo': 'abcde-1234',
            'information': 
            {
                'report': [
                     {
                        'a': '1',
                        'b': '2',
                        'c': '3'
                     },
                     {
                        'a': '1a',
                        'b': '2a',
                        'c': '3a'
                     },
                     {
                        'a': '1b',
                        'b': '2b',
                        'c': '3b'
                     },
                 ]
             }
        }";

        RootObj mainObj = JsonConvert.DeserializeObject<RootObj>(json);

        Console.WriteLine("somethingone: " + mainObj.somethingone);
        Console.WriteLine("somethingtwo: " + mainObj.somethingtwo);

        foreach (Dictionary<string, string> report in mainObj.information.report)
        {
            foreach (KeyValuePair<string, string> item in report)
            {
                string key = item.Key;
                string value = item.Value;

                Console.WriteLine(key + ": " + value);
            }
        }
    }
}

class RootObj
{
    public string somethingone { get; set; }
    public string somethingtwo { get; set; }
    public Information information { get; set; }
}

class Information
{
    public Dictionary<string, string>[] report { get; set; }
}

2 个答案:

答案 0 :(得分:1)

您正在为每本字典每行写一对键值对。

您要做的是先写出包含第一个词典中键的一行,然后为包含其值的每个词典写出一行。

您可以使用Write而不是WriteLine来写每个值而无需换行。然后在该行的末尾,使用WriteLine添加换行符。

代码如下:

Dictionary<string, string> firstDict = mainObj.information.report.FirstOrDefault();
if (firstDict != null)
{
    string format = "{0,-4} ";  // change the negative number to change the column width

    // write out the headers by getting the keys from the first dictionary
    foreach (string key in firstDict.Keys)
    {
        Console.Write(string.Format(format, key));
    }
    Console.WriteLine();

    // now write out the values for each dictionary
    foreach (Dictionary<string, string> dict in mainObj.information.report)
    {
        foreach (string value in dict.Values)
        {
            Console.Write(string.Format(format, value));
        }
        Console.WriteLine();
    }
}

注意:上面的代码假定报表中的每个字典将具有相同的键集。如果不是这样,那么您将需要对代码进行一些调整以处理不正常情况。

提琴:enter image description here

答案 1 :(得分:1)

与仅将一行解析的json直接转换为DataTable一样,您仅需一行代码即可将json转换为表格格式

DataTable dt = jToken["information"]["report"].ToObject<DataTable>();

因此,您可以一起利用JTokenDataTable来将json反序列化为直接插入表之类的

JToken jToken = JToken.Parse(json);

DataTable dt = jToken["information"]["report"].ToObject<DataTable>();

Console.WriteLine("a \t b \t c");
Console.WriteLine("-------------------");

foreach (DataRow dr in dt.Rows)
{
     Console.WriteLine($"{dr["a"]} \t {dr["b"]} \t {dr["c"]}");
}

Console.ReadLine();

输出:

enter image description here

Live Demo