物理的な建物を扱うアプリケーションのモデルの構築に取り組んでいます。
理想的には、次のようなものが必要です。
市には複数のオフィスがあり、複数の部屋があり、プロパティがあります。
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;
}
では、これを jackson で解析するにはどうすればよいでしょうか。現在、@JsonAnySetter を使用して名前を取得し、それを都市名またはオフィス名として保存してから、JsonAnySetter に送信された値を適切なネストされたクラスに送信しています。本当の問題は、市内のオフィスのリストを取得することです。mapper.readvalues(String, Office.class) を使用すると、各都市の最後のオフィスのみの反復子が返されます。アイデアはありますか?
わかりにくかったらすみません!私が作成した質問に答えたいと思います。
助けてくれてありがとう!