2

次のような JSON ドキュメントがあります。

{
  "aaa": [
    {
      "value": "ewfwefew"
    }
  ],
  "bbb": [
    {
      "value": "ewfewfe"
    }
  ]
}

これを次のようなよりクリーンなものに逆シリアル化する必要があります。

public class MyEntity{
  private String aaa;
  private String bbb;
}

各配列をアンラップし、逆シリアル化で「値」フィールドを抽出する最良の方法は何ですか?

4

2 に答える 2

3

@Tim Mac の応答は正しいですが、クラスのカスタム デシリアライザーを作成することで、よりエレガントにすることができます。MyEntity

次のようになります。

private class MyEntityDeserializer implements JsonDeserializer<MyEntity> {

  public MyEntity deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {

    JsonObject rootObj = json.getAsJsonObject();

    String nid = rootObj 
                   .get("nid")
                   .getAsJsonArray()
                   .get(0)
                   .getAsJsonObject()
                   .get("value")
                   .getAsString();

    String uuid = rootObj 
                   .get("uuid")
                   .getAsJsonArray()
                   .get(0)
                   .getAsJsonObject()
                   .get("value")
                   .getAsString();

    MyEntity entity = new MyEntity(nid, uuid);

    return entity;
  }
}

次に、次のように登録する必要がありますTypeAdapter

Gson gson = new GsonBuilder().registerTypeAdapter(MyEntity.class, new MyEntityDeserializer()).create();

最後に、JSON をいつものように解析する必要があります。

MyEntity entity = gson.fromJson(yourJsonString, MyEntity.class);

Gson は、カスタム デシリアライザーを自動的に使用して、JSON をMyEntityクラスに解析します。

于 2013-07-29T20:47:50.820 に答える
2

取得している json を変更できない場合は、そのままデシリアライズしてから、より管理しやすいものに変換することを検討してください。

public class TmpEntity {
    public Value[] nid {get;set;}
    public Value[] uuid {get;set;}
}

public class Value {
    public string value {get;set;}
}


public class MyEntity {
    public string nid {get;set;}
    public string uuid {get;set;}
}

var tmp = ...; //deserialize using javascriptserializer
var converted = tmp.Select(a => new MyEntity() 
{
    nid = a.nid.First().value,
    uuid = a.uuid.First().value
}
于 2013-07-29T14:27:29.933 に答える