1

JSON ファイルを POJO に読み込むのに問題があります。JSON ファイルに含まれる内容の一部を紹介します。

 {
    "Speidy": {
        "factionId": "2",
        "role": "ADMIN",
        "title": "",
        "power": 9.692296666666667,
        "powerBoost": 0.0,
        "lastPowerUpdateTime": 1337023306922,
        "lastLoginTime": 1337023306922,
        "chatMode": "PUBLIC"
    },
    "ShadowSlayer272": {
        "factionId": "2",
        "role": "NORMAL",
        "title": "",
        "power": 0.8673466666666667,
        "powerBoost": 0.0,
        "lastPowerUpdateTime": 1336945426926,
        "lastLoginTime": 1336945426926,
        "chatMode": "PUBLIC"
    },

私の問題は、最初の「ノード」が完全にランダムであることです。つまり、毎回異なる場合、POJO ファイルを作成するにはどうすればよいですか?

サブデータの POJO ファイルは次のようになります。

public class Node {
    private int factionId = 0;
    private String role = "";
    private String title = "";
    private double power = 0.0;
    private double powerBoost = 0.0;
    private int lastPowerUpdateTime = 0;
    private int lastLoginTime = 0;
    private String chatMode = "";
}

そして、私の他のPOJOファイルはこれです:

public class Container {
    private List<Node> nodes; //What should nodes be for GSON to get each random one?

    public List<Node> getNodes() {
        return nodes;
    }
}

すべての助けに感謝します、ありがとう。

アップデート

Listをaに変更してみましたMap

public class Container {
    private Map<String,Node> nodes;

    public Map<String,Node> getNodes() {
        return nodes;
    }

ノードファイルを同じに保ちながら。文字列は、プロパティ名 ieSpeidyまたはになりShadowSlayer272ます。ただし、gson はノードに対して何も実行せず、 and を実行しようとするとgetNodes()、オブジェクトが返されnullます。

助けてくれてありがとう。

4

2 に答える 2

2

オブジェクトのプロパティ名として、名前のように見えるもの(値を表すことを意図している可能性があります)をリストしています。代わりに、JSON文字列内に名前を含め、Javaノードクラスでプライベート変数(ゲッターとセッターを含む)として実際に表示されるプロパティ名を割り当てます。

これが適切に行われると、JSONを逆シリアル化してオブジェクトに戻すことができるはずです。また、サーバー側ではNodeコレクションをリストとして表しているため、JSONを2つのオブジェクトを含む配列に変換しました。node[0].nameJavaScriptでは、ととしてそれらにアクセスしますnode[1].name。これはnodes.get(0).getName()、サーバー側で次のようになります。

[
    {
        "name" : "Speidy",
        "factionId": "2",
        "role": "ADMIN",
        "title": "",
        "power": 9.692296666666667,
        "powerBoost": 0.0,
        "lastPowerUpdateTime": 1337023306922,
        "lastLoginTime": 1337023306922,
        "chatMode": "PUBLIC"
    },
    {
        "name" : "ShadowSlayer272",
        "factionId": "2",
        "role": "NORMAL",
        "title": "",
        "power": 0.8673466666666667,
        "powerBoost": 0.0,
        "lastPowerUpdateTime": 1336945426926,
        "lastLoginTime": 1336945426926,
        "chatMode": "PUBLIC"
    }
]

public class Node {
    private String name = "";

    private int factionId = 0;
    private String role = "";
    private String title = "";
    private double power = 0.0;
    private double powerBoost = 0.0;
    private int lastPowerUpdateTime = 0;
    private int lastLoginTime = 0;
    private String chatMode = "";
}

そうは言っても、本当に名前をプロパティ名として使用する必要がある場合は、JSONをリストではなくHashMapに逆シリアル化することを検討してください。リストは通常​​、JSON配列にマップされますが、マップは通常、親オブジェクト内の複数のJSONオブジェクトを表すのに適しています。

于 2012-05-19T20:06:41.790 に答える
1

JSONの形式を制御できる場合は、jmort253が彼の回答で提案している全体的なリスト構造を提案します[{"name":"Speidy", ... },{"name":"ShadowSlayer272", ... }]

生成されたJSONを制御できない場合は{"Speidy":{ ... },"ShadowSlayer272":{ ... }}、Gsonでの質問のようなJSONスニペットをマッピングする2つの方法があります。

  • あなたContainerクラスと少しのTypeTokenブードゥーなしで:

    // Ask Gson to deserialize the JSON snippet into a Map<String, Node>.
    Type type = new TypeToken<Map<String, Node>>() {}.getType();
    Map<String, Node> nodes = gson.fromJson(json, type);
    
  • あなたContainerクラスとカスタムでJsonDeserializer

    class ContainerDeserializer implements JsonDeserializer<Container> {
      public Container deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
          throws JsonParseException {
        List<Node> nodes = new ArrayList<Node>();
        JsonObject players = json.getAsJsonObject();
        for (Entry<String, JsonElement> player : players.entrySet()) {
          String playerName = player.getKey();
          JsonElement playerData = player.getValue();
          // Use Gson to deserialize all fields except
          // for the name into a Node instance ...
          Node node = context.deserialize(playerData, Node.class);
          node.name = playerName; // ... then set the name.
          nodes.add(node);
        }
        return new Container(nodes);
      }
    }
    

    これは、のようなコンストラクターを想定してContainer(List<Node>)おり、インスタンスを不変にすることができContainerます。これは通常、良いことです。

    次のようなカスタムシリアライザーを登録して使用します。

    GsonBuilder builder = new GsonBuilder();
    // Tell Gson to use the custom ContainerDeserializer whenever
    // it's asked for a Container instance.
    builder.registerTypeAdapter(Container.class, new ContainerDeserializer());
    Gson gson = builder.create();
    
    // Ask Gson to create Container instance from your JSON snippet.
    Container container = gson.fromJson(json, Container.class);
    
于 2012-05-21T21:36:33.973 に答える