0
    {
    "Employee": [
        {
            "empMID": "mock:1",
            "comments": [],
            "col1": "something",
            "contact": [{"address":"2400 waterview", "freetext":true}
                         ],
            "gender": "male"
        },
        {
            "empMID": "mock:2",
            "comments": [],
            "col1": "something",
            "contact": [{"address":"2200 waterview", "freetext":true}
                         ],
            "gender": "female"
        }
    ],
    "cola": false,
    "colb": false
}

これが私の Json ファイルの外観です。この json を csv に変換する必要があります (多次元データを 2d に変換しようとしています)。目的のために gson を使用しています。ジェネリックである必要があるため、テンプレートを使用して関数をオブジェクトにマップします。

CDL を使用して jsonarray を csv 形式に変換できることはわかっていますが、私の場合は機能しません。

私のcsv形式は次のようになります

Employee*
empMID,comment.$,contact.address,contact.freetext,gender
mock:1,,2400 waterview,TRUE,male
mock:123,,2200 waterview,TRUE,female
colA#
TRUE
colB#
FALSE

google-GSON api を使用してこの形式に変換しようとしましたが、この形式に変換できませんでした。* を使用して JSON 配列を表し、# を使用してプリミティブ型を表し、contact.address を使用してネストされた配列を表します。別のjson配列の内部。このネストされた構造に関連する問題があります。列のようにすべてを再帰的にトラバースできます。前もって感謝します

public static void main(String[] args) throws IOException{

        BufferedReader reader=null;
        StringBuilder content=null;
        String result=null;

            reader = new BufferedReader(new FileReader("temp.json"));

            String line = null;
            content= new StringBuilder();

            while ((line = reader.readLine()) != null) {
            content.append(line);
            }
            reader.close();
            result= content.toString();

            JsonElement jelement = new JsonParser().parse(result);

            printJsonRecursive(jelement);


        }


    public static void printJsonRecursive(JsonElement jelement){


        if(jelement.isJsonPrimitive()){

            System.out.println(jelement.getAsString());
            return;
        }
        if(jelement.isJsonArray()){

            JsonArray jarray= jelement.getAsJsonArray();
            for(int i=0;i<jarray.size();i++){
                JsonElement element= jarray.get(i);
                printJsonRecursive(element);
            }
            return;

        }
        JsonObject  jobject= jelement.getAsJsonObject();

        Set<Entry<String, JsonElement>> set= jobject.entrySet();

        for (Entry<String, JsonElement> s : set) {

            printJsonRecursive(s.getValue());


        }

    }



}
4

4 に答える 4

1

json にマップされたオブジェクトがある場合は、リフレクションを通じてこれを実現できます。

  1. gson/jackson を使用して json を Java オブジェクトに変換します

  2. クラスを反復してリフレクションを使用してフィールドを追加し、興味のあるフィールドを取得します。

  3. 対象オブジェクトから値を取得することにより、リフレクションで値を追加します。

詳細については、以下の私のブログ投稿をご覧ください。

vcfvct.wordpress.com/2015/06/30/converting-nested-json-files-to-csv-in-java-with-reflection/

于 2015-06-30T18:09:53.340 に答える
0

ライブラリjson2flatを使用して、 JSONCSVに変換できます。

このライブラリにはPOJOは必要ありません。これは単純にJSON を文字列として受け取り、その2D 表現を の形式で返しますList<Object[]>

たとえば、JSON の場合:

{
    "Employee": [
        {
            "empMID": "mock:1",
            "comments": [],
            "col1": "something",
            "contact": [{"address":"2400 waterview", "freetext":true}
                         ],
            "gender": "male"
        },
        {
            "empMID": "mock:2",
            "comments": [],
            "col1": "something",
            "contact": [{"address":"2200 waterview", "freetext":true}
                         ],
            "gender": "female"
        }
    ],
    "cola": false,
    "colb": false
}

次の出力が得られます。

/cola,/colb,/Employee/empMID,/Employee/col1,/Employee/gender,/Employee/contact/address,/Employee/contact/freetext
,,"mock:1","something",,"2400 waterview",true
,,"mock:2","something",,"2200 waterview",true
false,false,,,,,
于 2016-12-03T18:15:02.250 に答える