35

JSONメッセージを読むためにJacksonを使用しています。私が解析しようとしている値の 1 つはリストであり、別の値にはリスト内のデータの型が含まれています。これは私が Java で作成した構造です。

public class Message<T> {
   private Timestamp time;
   private RestAction action;
   private String type;
   private List<T> data;
}

リストClass.forName();内のデータを表すクラスを取得できます。問題は、リストをどのように読むことができるかです。

4

5 に答える 5

65

着信jsonをリストにマップする必要がある場合は、次のようにすることができます

String jsonString = ...; //Your incoming json string
ObjectMapper mapper = new ObjectMapper();
Class<?> clz = Class.forName(yourTypeString);
JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, clz);
List <T> result = mapper.readValue(jsonString, type);

編集

このようなものは、完全にテストされておらず、実行されたこともありません

public Message<T> deserialize(JsonParser jsonParser, DeserializationContext arg1)
    throws IOException, JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    ObjectCodec oc = jsonParser.getCodec();
    JsonNode node = oc.readTree(jsonParser);

    JsonNode timeStamp = node.get("time");
    Timestamp time = mapper.readValue(timeStamp, Timestamp.class);
    JsonNode restAction = node.get("action");
    RestAction action = mapper.readValue(restAction, RestAction.class);
    String type = node.get("type").getTextValue();
    Class<?> clz = Class.forName(type);
    JsonNode list = node.get("data");
    JavaType listType = mapper.getTypeFactory().constructCollectionType(List.class,   clz);
    List <T> data = mapper.readValue(list, listType);

    Message<T> message = new Message<T>;
    message.setTime(time);
    message.setAction(action);
    message.setType(type);
    message.setData(data);

    return message;
}
于 2013-07-31T20:00:53.173 に答える
-2

一般的なリストでjsonを読み取る必要がある場合は、次のようにします

{
    Employee:
    [
        {
            "key": "value",
            "key": "value"
        },
        {
            "key": "value",
            "key": "value"
        }
    ]
} 

あなたのjsonリストオブジェクトとあなたのBeanクラスは

class person {
private String key;
private String value;
}

これで、HashMap を使用してこの json を読み取ることができます

何かのようなもの

TypeReference<HashMap<String,List<Person>>> personList =  new   TypeReference<HashMap<String, List<Person>>>() {};

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

HashMap<String, List<Person>> employees = objectMapper.readValue(request.getInputStream(), personList);
于 2016-06-29T06:03:37.263 に答える