Spring Boot:转换复杂的json字符串响应对象

时间:2018-01-19 14:37:00

标签: json spring-boot

我想将一个复杂的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"
  },
...
]

2 个答案:

答案 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);

createdidtype之外的所有属性都将放置在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>>(){});
}