2017-10-04 1 views
0

私はインバウンドJsonオブジェクトを取得し、それを のキー値レコードに変換するツールを書いています(たぶんflatteningと呼ばれることもあります)。その目的は、Jsonオブジェクトが非常に大きいか、または非常にネストされている場合にツールが壊れないようにすることです。再帰を避けたいのです。C#Jsonすべての動的オブジェクトをキー値のペアに変換してください

例オブジェクトは、上記の目的のための所望の出力は次のようになり、ネストされた配列、空の値、あなたはそれに名前を付ける、文字通りあらゆる法的JSON ...

{ 
    "firstName": "John", 
    "lastName": "Smith", 
    "isAlive": true, 
    "age": 25, 
    "address": { 
    "streetAddress": "21 2nd Street", 
    "city": "New York", 
    "state": "NY", 
    "postalCode": "10021-3100" 
    }, 
    "phoneNumbers": [ 
    { 
     "type": "home", 
     "number": "212 555-1234" 
    }, 
    { 
     "type": "office", 
     "number": "646 555-4567" 
    }, 
    { 
     "type": "mobile", 
     "number": "123 456-7890" 
    } 
    ], 
    "children": [], 
    "spouse": null 
} 

を含む、(下)このようなことかもしれませんオブジェクトのすべての要素のためのキーと値のペア...

Key      Value 
/firstName    "John" 
/lastName    "Smith" 
/isAlive    "true" 
/age     "25" 
/address 
/address/streetAddress "21 2nd Street" 
/address/city   "New York" 
/address/state   "NY" 
/address/postalCode  "10021-3100" 
/phoneNumbers 
/phoneNumbers/1/ 
/phoneNumbers/1/type "home" 
/phoneNumbers/1/number "212 555-1234" 
/phoneNumbers/2/ 
/phoneNumbers/2/type "office" 
/phoneNumbers/2/number "646 555-4567" 
/phoneNumbers/3/ 
/phoneNumbers/3/type "mobile" 
/phoneNumbers/3/number "123 456-7890" 
/children 
/spouse 

Iは動的オブジェクトとしてメモリに上記の例のオブジェクトを有する、NewtonsoftのJSONクラスを使用してインポート。反復を繰り返すだけで、理想的な解は再帰を伴わないでしょう。吹き飛ばされたスタックは悪くなるからです。今後のお手伝いをありがとう。

+2

はNugetパッケージnewtonsoft json helpですか?あなたのツールをあなたのためにすでに書いています。https://www.newtonsoft.com/json –

+0

JSONの再帰呼び出しでスタックを吹き飛ばすと、JSONがあなたの吹き飛ばしたスタックよりも悪いと言えます。とにかく、私はあなたの質問にコードが見当たらず、あなたが何をしたのかの表示もなく、あなたにコードの一部を書くように頼んでいるような気がする。 – oerkelens

+0

@ Aaron.S - それを使って。文字列は動的オブジェクトに変換されていますが、オブジェクト構造は不明です。したがって、動的jsonオブジェクトのすべてのノードをどのように訪問するのですか?投稿に感謝します。 –

答えて

2

はこれを試してみてください:

var json = File.ReadAllText("test.txt"); 
var obj = JObject.Parse(json); 

var result = obj.Descendants() 
    .OfType<JProperty>() 
    .Select(p => new KeyValuePair<string, object>(p.Path, 
     p.Value.Type == JTokenType.Array || p.Value.Type == JTokenType.Object 
      ? null : p.Value)); 

foreach (var kvp in result) 
    Console.WriteLine(kvp); 

それはあなたを与える:

[firstName, John] 
[lastName, Smith] 
[isAlive, True] 
[age, 25] 
[address, ] 
[address.streetAddress, 21 2nd Street] 
[address.city, New York] 
[address.state, NY] 
[address.postalCode, 10021-3100] 
[phoneNumbers, ] 
[phoneNumbers[0].type, home] 
[phoneNumbers[0].number, 212 555-1234] 
[phoneNumbers[1].type, office] 
[phoneNumbers[1].number, 646 555-4567] 
[phoneNumbers[2].type, mobile] 
[phoneNumbers[2].number, 123 456-7890] 
[children, ] 
[spouse, ] 

私はあなたがパスにReplaceを作ることができると信じています。

+1

これは完璧です!完全な答えを探すためにここに来る人々を助けるために、私はNewtonsoft.Json.LinqとSystem.Linqのusingステートメントを追加しなければなりませんでした。 Regex.Replace(キー、 "\\ [(\\ d +)\\]"、区切り記号+ "$ 1")を使用しなければなりませんでした。大括弧を削除し、単純な文字列を置き換えます。 "区切り文字の場合、区切り文字はユーザーが選択したスラッシュのような文字です。偉大な答え、多くのありがとう、それは他の人にも役立つことを願っています –

関連する問題