我想将一个复杂的json字符串从gET请求转换为我们的数据库。我需要遍历所有对象并找到一些特定的对象。问题是,所有对象在某种程度上都是不同的。它们可能看起来像这三个例子,但还有更多:
{
"created": 1493209170473990,
"id": "fu:9843464EDF4D053072ACEAC2362EE0D8",
"type": "user-created"
},
{
"created": 1493209170883075,
"data": {
"process_type": "wallet-tx"
},
"id": "fu:6BE085BF29D7C8AF4C238615CA85F31A",
"process": "0CEB2F401E0FB9D9A44A124D0710B521",
"type": "process-created"
},
{
"created": 1495535185484487,
"data": {
"message": "electronic delivery"
},
"document": "25FBED0A80FEEBD6FF154D21D8E35D7E",
"id": "fu:3C17584381C0AFB4836F73057DB7DEAB",
"type": "info"
}
我需要找到一些特定类型的对象。但我不能让他们脱离一个字符串。我通过此调用获取请求数据:
@RequestMapping(value="/events", method=RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
public String getEvents() {
int created_after = 0;
final String url = server + "/rest/client/events/" + created_after;
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json; charset=utf-8");
headers.set("Auth-Token", token); // user_token
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
return response.getBody();
}
我在我的前端使用Angular,这可以很容易地将字符串转换为Object,但是我必须再将它传递给我的后端来处理数据。我想把所有东西都留在后端。你知道如何解决它吗?
如果您需要更多信息,请询问。感谢
编辑: 我的JSON outpup看起来像这样:
[
{
"created": 1493209170473990,
"id": "fu:9843464EDF4D053072ACEAC2362EE0D8",
"type": "user-created"
},
{
"created": 1493209170653925,
"data": {
"verify_id": "12581C42DD2DF7D80F802C50ABD144F8"
},
"id": "fu:06111B0A9C5B760B9269044DA97D3D6F",
"type": "post-address-verification-confirmed"
},
{
"created": 1493209171320041,
"data": {
"after": {
"attempt": 1
}
},
"id": "fu:7B5B2AD57C1CE97BB642931C2C3C819D",
"process": "0CEB2F401E0FB9D9A44A124D0710B521",
"type": "process-updated"
},
...
]
答案 0 :(得分:4)
我理解它的方式,你的对象有一些共同的属性,以及一些可选的属性。您可以使用@JsonAnyGetter
和@JsonAnySetter
:
class Data {
@JsonProperty
private Long created;
@JsonProperty
private String id;
@JsonProperty
private String type;
private Map<String, Object> optional = new HashMap<>();
public Data() { // empty public constructor is required
}
// getters/setters for all properties omitted for brevity
@JsonAnySetter
public void addOptional(String name, Object value) {
optional.put(name, value);
}
@JsonAnyGetter
public Object getOptional(String name) {
return optional.get(name);
}
}
然后,您可以使用
反序列化对象ObjectMapper objectMapper = new ObjectMapper();
Data data = objectMapper.readValue(j, Data.class);
或者,如果您有一个Data对象数组作为输入,
Data[] data = objectMapper.readValue(j, Data[].class);
除created
,id
和type
之外的所有属性都将放置在optional
地图中。
答案 1 :(得分:2)
如果你不知道JSON的结构是什么,那么你可以将你的JSON字符串序列化为一个Map,它将json中的字段名称映射到它们的值。
这可以使用Jackson ObjectMapper完成:
String jsonObject = <the string JSON response you obtained>;
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> jsonMap = objectMapper.readValue(jsonString,
new TypeReference<Map<String, Object>>(){});
如果它是您期望的JSON对象列表,那么您可以先将其映射到JSON字符串数组,然后将每个对象转换为映射:
ObjectMapper objectMapper = new ObjectMapper();
String[] jsonStrings = objectMapper.readValue(jsonString, String[]);
List<Map<String, Object>> jsonMaps = new ArrayList<>();
for (String json : jsonStrings) {
jsonMaps.add(objectMapper.readValue(json,
new TypeReference<Map<String, Object>>(){});
}