如何在C#中遍历通用字典列表

时间:2013-05-16 08:45:44

标签: c# json dictionary

我有一个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格式可以根据用户输入而变化。

enter image description here

3 个答案:

答案 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>