1

Objectifyを永続レイヤーとして使用してJSONドキュメントをAppEngineデータストアに保存しようとしています。Stringドキュメント全体をフィールドとして挿入するのではなく、ドキュメント値をクエリできるようにするために、MapEntity次のようなを作成しました。

@Entity(name="Map") 
public class MapEntity {
    @Id
    private Long id;
    private Map<String,String> field;
        // Code omitted 
}

最終的に「展開」されると、JSONドキュメント内のすべてのKey-ValueをMapで表すことができるようになります。

例:

    String           subText          = "{\"first\": 111, \"second\": [2, 2, 2], \"third\": 333}";
    String           jsonText         = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789, \"fourth\":"
                                        + subText + "}";

マップフィールドをデータストアに保存します。

KEY              VALUE
field.first  => 123
field.second => [4,5,6]
field.third  => 789
field.fourth-first => 111
field.fourth-second => [2,2,2]
field.fourth-third => 333

私のparse()方法を使用する場合:

JSON.Simpleライブラリを使用してJSONドキュメントを解析してから、再帰的な解析を実行します。

private MapEntity parse(String root, MapEntity entity, Map json) {
    Iterator iter = json.entrySet().iterator();
    while (iter.hasNext()) {
         Map.Entry entry = (Map.Entry) iter.next();
         if (entry.getValue() instanceof Map){
             entity = parse((String)entry.getKey()+"-", entity, (Map) entry.getValue());
             System.out.println("Map instance");
         } else {
             entity.setField(root + String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));  
         }
    }
    return entity;
}

私のアプリは次のように動作します:

 MapEntity jsonEntity = new MapEntity();
 Map json = null;
 json = (Map) parser.parse(jsonText, containerFactory); // JSON.Simple parser
 jsonEntity = parse("", jsonEntity, json);

私が遭遇する問題は次のとおりです。

  • 「。」は使えません。マップキーフィールドにドットがあるので、「-」を使用する必要があります
  • また、JSONドキュメントを保存する私のアプローチはあまり効率的ではありません
4

2 に答える 2

0

JSONが厳密な形式に従っている場合は、データ形式を表すクラスを作成し、 Jacksonなどのライブラリを使用してそのクラスとの間で直接シリアル化する方がよいでしょう。そのクラスをObjectifyのエンティティクラスとして直接使用できますが、実行するかどうかは、次のことを実行するかどうかによって異なります。

  • まったく同じデータセットを保存して公開する
  • ストレージとJSON表現を緊密に結合します
于 2012-11-12T23:40:57.027 に答える
-1

MapEntityの代わりにJSONObjectを使用し、toString()メソッドを使用してjsonをGoogleAppEngineに文字列として保存できます。取得時に、適切なコンストラクターを使用してJSONObjectを復元するだけで済みます。もちろん、これにより、AppEngineでプロパティにインデックスを付けてクエリを実行する機能が制限されます。

Objectifyにこれを実行させたい場合は、翻訳者を登録して、toString()の呼び出しと再構築を処理できます。

于 2013-01-03T00:14:26.840 に答える