0

Dictionary のリストに変換された json オブジェクトがあります。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>) です。ここで、各ディクショナリの値は再びディクショナリであり、ディクショナリの各値を動的に反復し、値が Xpath である最後のキーと値を取得する必要があり、xpath から値を取得する必要があります。 . 辞書を反復処理するための解決策を教えてください。json 形式はユーザー入力によって異なる可能性があるため、一般的なものにする必要があります。

ここに画像の説明を入力

4

3 に答える 3

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);
    }
}

これは 1 つまたは 2 つの仮定を行いますが、辞書と k​​vps で構成されていると仮定して、すべてのデータを反復処理します。

編集: XPath を持っていて、ノードを取得したい場合はXMLDocument、データを入れて準備する必要があります。上記のコードを使用してデータをウォークスルーし、作成してからXMLDocumentクエリを実行するのに役立てることができます。 XPath を含むドキュメント。

于 2013-05-16T09:02:17.027 に答える
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);
            }
        }
    }

お役に立てれば

于 2013-05-16T09:00:59.357 に答える
0

Json.NETを使用してオブジェクトをシリアル化することをお勧めしますが、入力は動的であると述べましたが、属性は標準化されていますか? サンプルを見ると、いくつかの繰り返しフィールドがあります。次のようにして、jsonをクラスに逆シリアル化できます

JsonConvert.DeserializeObject<YOUR_CUSTOM_OBJECT>
于 2013-05-16T08:56:40.517 に答える