我有一个json对象,它已被转换为Dictionary列表。 json如下:
{
"DataList":
{"Non Fuel":
{
"sn":"/DataXmlProduct/Customers/DataXml/Customer/DueDate",
"ItemCode":"/DataXmlProduct/Customers/DataXml/Customer/InvoiceNo",
"Qty":"/DataXmlProduct/Customers/DataXml/Customer/CustomerNo",
"Amount":"DataXml/Customer/TotalCurrentCharges"
},
"Fuel":{
"sn":"/DataXmlProduct/Customers/DataXml/Customer/InvoiceNo",
"ItemCode":"/DataXmlProduct/Customers/DataXml/Customer/InvoiceNo",
"Amount":"DataXml/Customer/TotalCurrentCharges"
}
}
}
结果是(Dictionary<string, object>
),这里每个字典的值又是一个字典,我需要动态迭代字典的每个值并得到最后一个字符&amp;值是Xpath并且需要从xpath获取值的值。
请帮我解决迭代字典的问题。它应该是通用的,因为json格式可以根据用户输入而变化。
答案 0 :(得分:3)
假设实际值(例如fuel
的内容)以KeyValuePair<string, object>
形式出现,那么您可以使用递归方法执行此操作:
public static void ParseData(object source)
{
Dictionary<string, object> Dict;
KeyValuePair<string, object> Kvp;
if ((Dict = source as Dictionary<string,object>) != null)
{
foreach(var kvp in Dict)
{
Console.WriteLine(kvp.Key);
ParseData(kvp.Value);
}
}
elseif ((Kvp = source as KeyValuePair<string, object>) != null)
{
Console.WriteLine("{0}{1}", Kvp.Key, Kvp.Value);
}
}
这是一个或两个假设,但是假设它由字典和kvps组成,它将迭代所有数据。
编辑:如果您有一个XPath并想要获得一个节点,那么您需要做的是准备一个XMLDocument
数据。您可以使用上面的代码来浏览数据帮助您构建XMLDocument
,然后使用XPath查询文档。
答案 1 :(得分:1)
以下是处理所有数据的基本代码:
static void IterateDictionary(Dictionary<string, object> dictionary)
{
foreach (var pair in dictionary)
{
System.Console.WriteLine("Processing key: " + pair.Key);
object value = pair.Value;
var subDictionary = value as Dictionary<string, object>;
if (subDictionary != null)
{
// recursive call to process embedded dictionary
// warning: stackoverflowexception might occur for insanely embedded data: dictionary in dictionary in dictionary in . etc
IterateDictionary(subDictionary);
}
else
{
// process data
System.Console.WriteLine("data: {0}", value);
}
}
}
希望这会有所帮助
答案 2 :(得分:0)
我建议使用Json.NET来序列化您的对象,但是,您已经提到输入是动态的,但标准属性是什么?看看你的样本,有几个重复的字段。您可以通过执行
将json反序列化到您的类中JsonConvert.DeserializeObject<YOUR_CUSTOM_OBJECT>