簡體   English   中英

使用Jackson解析復雜的JSON對象列表

[英]Parse list of complex JSON objects using Jackson

我有一個類似JSON對象的列表:

[
  {
    "id": "A",
    "objs": [
      { "obj1": 1 },
      { "obj2": 0 },
    ]
  },
  {
    "id": "A",
    "objs": [
      { "obj1": 1 },
      { "obj2": 0 },
    ]
  }
]

並希望將它們加載到MyObj列表中:

class MyObj {
  private final String id;
  private final HashMap<String, Integer> objs;

  // Constructors, etc. here...
}

ArrayList<MyObj> list;

有沒有什么聰明的方法可以使用Jackson ObjectMapper或其他綁定來做到這一點? 即,以最少的樣板代碼? 沒有HashMap,這將是一個簡單的問題:

list = mapper.readValue(file, new TypeReference<ArrayList<MyOBJ>>() {});

但是HashMap似乎可以殺死它。 有想法嗎?

如果您能夠使用傑克遜(Jackson)注釋,並且不太在乎性能,則可以執行以下討厭的小技巧:

// Put this in the MyObj class
@JsonSetter(value="objs")
public void setObjs(HashMap<String, Integer>[] units) {
    objs = new HashMap<String, Integer>();
    for (HashMap<String, Integer> unit : units) {
        for (String key : unit.keySet())
            objs.put(key, unit.get(key));
    }
}

但是干凈的方法是編寫MyObjDeserializer建議的MyObjDeserializer。

注意"objs"數組中的那些前導逗號。

首先,您需要一個用於JSON的模型類。 然后,您應該編寫自己的解析器以將數據讀取到數組(Map,List等)。 傑克遜

我的舊項目中的一個小例子。

型號類別:

package ru.model;

import javax.persistence.*;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Entry implements Serializable {
    private static final long serialVersionID = 8201337883209943936L;

    private Integer primary_id;
    private Integer id;
    private String description;
    private Integer votes;
    private String author;
    private Date date;
    private String gifURL;
    private String previewURL;
    private String embedId;
    private String type;

//  getters and setters
}

解析器示例:

public static List<Entry> getAllEntries(String jsonString) {        
    List<Entry> entries = new ArrayList<Entry>();                               
        try {
            if (jsonString.length() == 0) {
                throw new Exception("Empty json!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        ObjectMapper objectMapper = new ObjectMapper();

        try {
            JsonNode rootNode = objectMapper.readTree(jsonString);
            JsonNode resultNode = rootNode.findPath("result"); // choose concrete element in JSON array
            if (resultNode.size() > 0) {
                for (int i = 0; i < resultNode.size(); i++) {
                    entries.add(objectMapper.readValue(resultNode.get(i).toString(), Entry.class));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    return entries;
}

JSON范例:

{"result":
[
{"id":94,
"description":"description111",
"votes":1,
"author":"sashvd",
"date":"Mar 15, 2013 4:09:03 PM",
"gifURL":"http://-..",
"previewURL":"http://.."}
],
"totalCount":88}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM