我想将一个复杂的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"
}
Run Code Online (Sandbox Code Playgroud)
我需要找到一些具有特定类型的对象,但无法从字符串中获取它们。我通过此调用获取请求数据:
@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();
}
Run Code Online (Sandbox Code Playgroud)
我在前端使用Angular,可以轻松地将字符串转换为Object,但是随后我必须再次将其传递给后端才能使用数据。我想将所有内容保留在后端。您知道如何解决吗?
如果您需要更多信息,请询问。谢谢
编辑:我的JSON输出看起来像这样:
[
{
"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"
},
...
]
Run Code Online (Sandbox Code Playgroud)
如果您不知道 JSON 的结构是什么,那么您可以将 JSON 字符串序列化为 Map,该 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>>(){});
Run Code Online (Sandbox Code Playgroud)
如果它是您期望的 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>>(){});
}
Run Code Online (Sandbox Code Playgroud)
以我的理解,您的对象具有一些通用属性以及一些可选属性。您可以使用@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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用来反序列化对象
ObjectMapper objectMapper = new ObjectMapper();
Data data = objectMapper.readValue(j, Data.class);
Run Code Online (Sandbox Code Playgroud)
或者,如果您将数据对象数组作为输入,
Data[] data = objectMapper.readValue(j, Data[].class);
Run Code Online (Sandbox Code Playgroud)
所有属性除外created,id并且type将被放置在optional地图上。
| 归档时间: |
|
| 查看次数: |
6233 次 |
| 最近记录: |