1

jacksonを使用してJSON属性名をJavaフィールド値にマップする方法は?

これ:

{ "list":[  { "monday":[ "apple", "bread"] } ,
            { "sunday":[ "bacon", "beer" ] } ],
  "kind":"shoplist" }

これに:

public class StuffList {
    public List<Stuff> list;
    public String kind;
}

public class Stuff {
    public String name;
    public List<String> items; 
}

フラグメント"monday":[ "apple", "bread"]は、属性名を持つ変数と属性値を持つ変数の 2 つの変数にマップされます。

4

2 に答える 2

1

アノテーション@JsonPropertyを使用 名前を変更したい場合は、引数付きのアノテーションを使用します。@JsonProperty("stuff_name")

于 2013-05-22T15:19:32.330 に答える
1

JSON はマップの単純なリストを表します。より正確にはList<Map<String, List<String>>>. この JSON をこの POJO に変換できます。

class JsonEntity {

    public List<Map<String, List<String>>> list;
    public String kind;

    public StuffList toStuffList() {
        StuffList stuffList = createStuffListObject();

        return stuffList;
    }

    private StuffList createStuffListObject() {
        StuffList stuffList = new StuffList();
        stuffList.kind = kind;
        stuffList.list = createItemsList();

        return stuffList;
    }

    private List<Stuff> createItemsList() {
        List<Stuff> items = new ArrayList<Stuff>(list.size());
        for (Map<String, List<String>> item : list) {
            items.add(convertToStuff(item));
        }

        return items;
    }

    private Stuff convertToStuff(Map<String, List<String>> item) {
        Stuff stuff = new Stuff();
        stuff.name = item.keySet().iterator().next();
        stuff.items = item.values().iterator().next();

        return stuff;
    }
}

これで、次の方法で JSON を逆シリアル化できます。

public static void main(String[] args) throws Exception {
    String json = "{\"list\":[{\"monday\":[\"apple\", \"bread\"]},{\"sunday\":[\"bacon\", \"beer\"]} ],\"kind\":\"shoplist\"}";

    ObjectMapper objectMapper = new ObjectMapper();
    JsonEntity jsonEntity = objectMapper.readValue(json, JsonEntity.class);
    System.out.println(jsonEntity.toStuffList());
}

プログラムの出力:

list=[[name=monday, items=[apple, bread]], [name=sunday, items=[bacon, beer]]], kind=shoplist
于 2013-05-23T21:07:19.767 に答える