我正在尝试从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; }
}
答案 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();
}
}
注意:上面的代码假定报表中的每个字典将具有相同的键集。如果不是这样,那么您将需要对代码进行一些调整以处理不正常情况。
答案 1 :(得分:1)
与仅将一行解析的json直接转换为DataTable
一样,您仅需一行代码即可将json转换为表格格式
DataTable dt = jToken["information"]["report"].ToObject<DataTable>();
因此,您可以一起利用JToken
和DataTable
来将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();
输出: