我将以下JSON分配给变量strP
:
{"get_the_data":[{"when_date":"09/12/2019","which_loc":"Orlando","who_witness":"visitor"}]}
我需要生成以下输出:
get_the_data:
when_date - 09/12/2019
which_loc - Orlando
who_witness - visitor
如何反序列化此JSON以获取对象中每个数组的KEY和VALUE?这是我到目前为止所尝试的:
string object1, string array1;
var jsonObj = new JavaScriptSerializer().Deserialize<RO>(strP);
//get the parent key: 'get_the_data'
object1 = get_the_data.ToString();
foreach (var p in strP._data)
{
//how can I get the KEY and the VALUE of each array within the object
array1 += p.Key + " - " + p.Value + Environment.NewLine; //e.g. when_date - 09/12/2019
}
Console.WriteLine(object1 + ":" + Environment.NewLine + array1);
//...
public class Data1
{
public string when_date { get; set; }
public string which_loc { get; set; }
public string who_witness { get; set; }
}
public class RO
{
public List<Data1> _data { get; set; }
}
P.S。我想避免使用外部JSON库并使用本机C#方法。
答案 0 :(得分:1)
如果您只想提前获取JSON中的键和值而不事先对键名进行硬编码,则可以反序列化为Dictionary<string, List<Dictionary<string, string>>>
:
var jsonObj = new JavaScriptSerializer().Deserialize<Dictionary<string, List<Dictionary<string, string>>>>(strP);
string indent = " ";
var sb = new StringBuilder();
foreach (var outerPair in jsonObj)
{
sb.Append(outerPair.Key).AppendLine(":");
outerPair.Value.SelectMany(d => d).Aggregate(sb, (s, p) => s.Append(indent).Append(p.Key).Append(" - ").AppendLine(p.Value));
}
Console.WriteLine(sb);
顺便提一下,您的RO
类型不能用于反序列化问题中显示的JSON,因为其属性的名称为:
public List<Data1> _data { get; set; }
与JSON中的属性名称不同:
{"get_the_data":[ ... ] }
这些属性名称需要匹配,因为JavaScriptSerializer
在(反)序列化期间没有内置支持重命名属性。有关详细信息,请参阅here。