2017-01-30 13 views
1

JSONオブジェクトをCSVファイルにエクスポートしたいと思いますが、サブフィールドにはオブジェクトの配列によってサブフィールドが設定されている可能性がありますCSVの埋め込みデータを表します。CSVでJSONオブジェクトを表現する方法

+0

あなたの目標は何ですか?たぶん、YAMLの糖衣構文を検討 –

+1

という一般的な答えはありません、あなたはいくつかのサンプルデータをポストする必要があります。 CSVはフラットな円柱データストアであり、フラットな円柱データでのみ機能します。あなたのjsonが、例えば、データのようなリストを保持するリスト、またはデータのような辞書のリストである場合、おそらくあなたは何かを持っています。しかし、一般的な1対1のマッピングはありません。 – tdelaney

+0

は、あなたが「tableize」あなたのデータに必要なすべての最初の、CVSはテーブルですので、あなたのデータは、任意の部分構造ずにオブジェクトの配列でなければなりません。データ構造を投稿して、これを実現する方法を見つけ出すことができます。 – misher

答えて

2

これは、表形式のデータにマッピングする半構造(ツリー状)のデータにダウンしています。インピーダンスの不一致のため、これはまったく簡単なことではありません。

実際には一般的に使用されている(そして教えられている)方法がいくつかあり、主にXML用に確立された広範な学術研究がありますが、原則としてJSONにも適用できます。

    あなたのデータのような規則的なパターンを(以下の場合は、まず

  • ツリーエンコーディングを破砕
  • アドホック(スキーマベース)マッピング
  • エッジ:多かれ少なかれに降りてくるのアプローチスキーマ)では、たとえば、各リーフ(値)をCSVの列にマップできるアドホックマッピングを設計できます。ドットがフィールドで使用されていないと仮定して、構造体に関する情報をドットで保存することができます。例えば

    :ゲーム内の配列が存在する場合トリッキー一部である

    | foo.bar | foobar | 
    |---------|--------| 
    | 10  | foo | 
    

    { 
        "foo" : { 
        "bar" : 10 
        }, 
        "foobar" : "foo" 
    } 
    

    をにマッピングすることができます。

    { 
        "objects" : [ 
        { 
         "foo" : { 
         "bar" : 10 
         }, 
         "foobar" : "foo" 
        }, 
        { 
         "foo" : { 
         "bar" : 40 
         }, 
         "foobar" : "bar" 
        }, 
        { 
         "foo" : { 
         "bar" : 50 
         }, 
         "foobar" : "bar" 
        } 
        ] 
    } 
    

    にマッピングできます:出力CSV内のすべての行は、あなたが同様のオブジェクトの大きな配列を持っている場合は、あなたがそれらを作ることができ

    | objects.pos | objects.foo.bar | objects.foobar | 
    |-------------|-----------------|----------------| 
    |  1  |  10   |  foo  | 
    |  2  |  40   |  bar  | 
    |  3  |  50   |  bar  | 
    

    これは、最も簡単だろうなアプローチであります出力CSVはまだ分かりやすいですが、ユースケースごとにデータを調整するために、特にアレイの配置が異なる場合には、再度設計する必要があります。

    理論的な観点から、この第1のアドホックアプローチは、データを正規化して、すなわち第1正規形以上にする。

    エッジシュレッディングやツリーエンコーディングなど、より一般的なアプローチがあります。デコードにはかなりの作業が必要なため、ユースケースでは余計に使用される可能性があるため、リレーショナルデータベースの上に複雑なXMLクエリを実装する意味があります。

    要するに、エッジシュレッダーでは、葉を格納する各タイプ(JSONでは数値、文字列、ブール値など)ごとに1つのテーブル(CSVファイル)を作成し、元のJSONツリーのエッジ。

    tree encodingで、あなただけのスマートすべてのノードとツリーの葉を保存する1つのテーブル(CSVファイル)を使用します。ここでも、XMLにチューニングされていますが、おそらく適応可能です。

    JSONはXMLよりも若干若いので、テーブルへのマッピングについて既にどの程度の研究が行われているのかよくわかりません。一般的なマッピングではなくJSONに具体的に対処することも可能です原則は似ています。

  • +0

    これは本当に面白そうです! JSONオブジェクトが配列に埋め込まれているため、オブジェクトがかなり複雑になりました。他の配列の子となることもあります。私はエッジ破砕し、ツリーのエンコードに近い顔をしているでしょうが、私は私も人間が読めるファイルとマシン解析可能なを持っているためにすぐに解決策を見つけないと思います。ありがとう! – awzx

    +0

    実際、人間が読めるようにする必要がある場合は、アドホックなアプローチが最適と思われます。 JSONデータが非常に規則的であり、すべてのオブジェクトが限られたスキーマセットに多かれ少なかれ一致する場合は、ネストされた配列やオブジェクトでも機能するはずです。ネスティングのいくつかのレベルでは、これの上に、高、標準形との間の妥協の重大な問題(外部キーを持つ複数のCSVファイルが、非常に小さな重複)以下正規形(潜在的に1つのCSVファイルが、来ます重複データの多く)。これは、データで何をする必要があるのか​​、また、使用量が読取りまたは書込み集中であるかによって異なります。 –

    関連する問題