2017-11-22 5 views
1

ドキュメントを持つので、すべてのフルパスのリストをJavaで取得したいと思います。このドキュメント持っ例えばMongoDB:すべてのフルリーフパス

、:

"A.B.D", 
"A.C.E", 
"A.C.F" 

がこれを行うには、いくつかの "MongoDBの" ライブラリへの機能があります:

{A : { 
    B : { 
     D : "d" 
    } 
    C : { 
     E : "e", 
     F : "f" 
    } 
} 

を私はこのList<String>を取得したいと思いますか? 再帰を使用せずに手動で書き込む方法はありますか?

答えて

0

解決策を見つけました。

私はjsonDocumentをtransforするGsonライブラリの電源を使用してcom.google.gson.stream.JsonReaderを使用して、それを読んだ後。

コードはパフォーマンスが向上している可能性がありますが、このコードは大丈夫ですが、私はほんの少しのドキュメントしか読み込まないといけません。

public static List<String> leafPaths(Document document) { 
    String json = gson.toJson(document); 
    List<String> leafPaths = new ArrayList<>(); 
    try (JsonReader reader = new JsonReader(new StringReader(json))) { 
     // scorro tutti gli elemento dello json 
     while (true) { 
      JsonToken token = reader.peek(); 
      switch (token) { 
       case BEGIN_ARRAY: 
        reader.beginArray(); 
        break; 
       case END_ARRAY: 
        reader.endArray(); 
        break; 
       case BEGIN_OBJECT: 
        reader.beginObject(); 
        break; 
       case END_OBJECT: 
        reader.endObject(); 
        break; 
       case NAME: 
        reader.nextName(); 
        break; 
       case STRING: 
        reader.nextString(); 
        leafPaths.add(reader.getPath()); 
        break; 
       case NUMBER: 
        reader.nextDouble(); 
        leafPaths.add(reader.getPath()); 
        break; 
       case BOOLEAN: 
        reader.nextBoolean(); 
        leafPaths.add(reader.getPath()); 
        break; 
       case NULL: 
        reader.nextNull(); 
        break; 
       case END_DOCUMENT: 
        // tutti i campi 
        return leafPaths.stream().map(field -> field.substring(2)).collect(toList()); 
       default: 
        break; 
      } 
     } 

    } catch (Exception e) { 
     return leafPaths; 
    } 
} 
関連する問題