2

次の JSON があるとします。これは、他の誰かによって Web フィードで提供されているため、変更できません。Jackson を使用してこれを Java オブジェクトに解析したいと思います。

{
"2002": [
  {
    "d": "description",
    "t": "title"
  }
],
"2003": [
  {
    "d": "description",
    "t": "title"
  }
]
}

このデータは、たとえば、ids=2002、2003 などのテレビ番組のリストを表し、各番組には説明とタイトルがあります。このデータを解析して、各プログラム クラスにフィールド d と t がある一般的なプログラム クラスのリストを作成したいと考えています。2002年、2003年などのオブジェクトに個別のクラスを持ちたくありません。2002、2003 などの ID は実行時まで不明であり、時間の経過とともに進化する可能性があり、可能な値の非常に長いリストになる可能性があることを念頭に置いてください。

id フィールドが json 文字列からのオブジェクト名の名前と等しい汎用プログラムのリストとしてこれをモデル化することは可能ですか? 言い換えれば、私はこれを望んでいません:

public class AllProgrammes {
  private List<com.example._2002> _2002;
  private List<com.example._2003> _2003;
  // getters and setters
}

代わりに、これには だけを含める必要がList<Programmes>あり、各プログラム オブジェクトには id = 2002、または 2003、またはその他の id が必要です。

ありがとう。

4

1 に答える 1

2

Google Gson を使用できる場合は、次の方法で実行できます。

プログラム.クラス

public class Program {
  private String id;
  private String title;
  private String description;

  public Program(String id, String title, String description) {
    this.id = id;
    this.title = title;
    this.description = description;
  }

  @Override
  public String toString() {
    return String.format("Program[id=%s, title=%s, description=%s]", this.id, this.title, this.description);
  }
}

ProgramsDeserializer.class

import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

class ProgramsDeserializer implements JsonDeserializer<List<Program>> {
  @Override
  public List<Program> deserialize(JsonElement e, Type type, JsonDeserializationContext jdc) throws JsonParseException {
    List<Program> programs = new ArrayList<>(10);
    JsonObject root = e.getAsJsonObject();
    for (Map.Entry<String, JsonElement> entry : root.entrySet()) {
      String id = entry.getKey();
      String title = "";
      String description = "";
      JsonElement arrayElement = entry.getValue();
      if (arrayElement.isJsonArray()) {
        JsonArray array = arrayElement.getAsJsonArray();
        JsonElement objectElement = array.get(0);
        if (objectElement.isJsonObject()) {
          JsonObject object = objectElement.getAsJsonObject();
          title = object.get("t").getAsString();
          description = object.get("d").getAsString();
        }
      }
      programs.add(new Program(id, title, description));
    }
    return programs;
  }
}

GsonExample.class

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class GsonExample {
  private static final Logger logger = Logger.getLogger(GsonExample.class.getName());
  private static final String JSON = 
    "{"
      + "\"2002\": ["
        + "{"
          + "\"d\": \"description\","
          + "\"t\": \"title\""
        + "}"
      + "],"
      + "\"2003\": ["
        + "{"
          + "\"d\": \"description\","
          + "\"t\": \"title\""
        + "}"
      + "]"
    + "}";

  public static void main(String[] args) {
    GsonExample e = new GsonExample();
    e.run();
  }

  private void run() {
    GsonBuilder builder = new GsonBuilder();
    Type type = new TypeToken<List<Program>>(){}.getType();
    builder.registerTypeAdapter(type, new ProgramsDeserializer());
    Gson gson = builder.create();
    List<Program> programs = gson.fromJson(JSON, type);
    logger.log(Level.INFO, "{0}", programs);
  }
}
于 2012-12-21T12:39:08.070 に答える