致力於爲處理物理建築物的應用程序構建模型。使用Jackson在具有未知鍵名的同一文件中處理多個JSON對象
理想情況下,我們會想是這樣的:
市有多個辦事處,其中有多個房間,其中有屬性。
我們使用jackson來解析從API數據源接收到的JSON負載,它看起來有點不同於我見過的示例。
我們得到的格式是:
{
"CityName1":
{ "OfficeName1":
[
{"name": RoomName1, "RoomProperty2": RoomValue1},
{"name": RoomName2, "RoomProperty2": RoomValue2}
]
},
{ "OfficeName2": [{...}]},
{ "OfficeNameX" : [{...}] },
"CityName2": {...},
"CityNameN": {...}}
Java類:
public class City {
private Map<String, Object> additionalProperties = new HashMap<String, Object();
private List<Office> _offices = new ArrayList<Office>();
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value)
throws IOException {
_cityName = name;
String officeJson = _mapper.writeValueAsString(value);
StringBuilder sb = new StringBuilder(officeJson);
_offices.add(_mapper.readValue(officeJson, Office.class));
this.additionalProperties.put(name, value);
}
}
public class Office {
private String _officeName;
private static final ObjectMapper _mapper = new ObjectMapper();
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
private List<Room> _rooms = new ArrayList<Room>();
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value)
throws IOException {
_officeName = name;
String roomJson = _mapper.writeValueAsString(value);
Room[] rooms = _mapper.readValue(roomJson, Room[].class);
_rooms.addAll(Arrays.asList(rooms));
this.additionalProperties.put(name, value);
}
public List<Room> getRooms() {
return _rooms;
}
public void setRooms(List<Room> rooms) {
_rooms = rooms;
}
}
public class Room {
private static final String NAME = "name";
private static final String PROP_2 = "RoomProperty2";
@JsonProperty(PROP_2)
private String _propertyTwo;
@JsonProperty(NAME)
private String name;
@JsonProperty(PROP_2)
public String getPropertyTwo() {
return _propertyTwo;
}
@JsonProperty(PROP_2)
public void setPropertyTwo(String propTwo) {
_propertyTwo = propTwo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
那麼我將如何去與傑克遜解析呢?目前,我使用@JsonAnySetter來獲取名稱,並將其保存爲城市或辦公室名稱,然後將發送給JsonAnySetter的值發送到相應的嵌套類。真正的問題是獲得城市辦事處名單。當使用mapper.readvalues(String,Office.class)時,我只返回每個城市最後一個辦公室的迭代器。任何想法傢伙?
對不起,如果這似乎令人困惑!願意回答我創建的任何問題。
感謝您的幫助!
像往常一樣,顯示涉及的Java類在這裏是必要的。 – StaxMan
新增課程。問題是_offices只包含1個辦公室,當它包含N. – Ajayc
一個簡單的建議:不要寫json,重新讀取,試試'ObjectMapper.convertValue(value,Office.class')。同樣的事情,更簡單,更多有效。 – StaxMan