繁体   English   中英

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

[英]Spring Boot: Convert complex json string response to object

我想将一个复杂的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输出如下所示:

[
  {
    "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"
  },
...
]

我理解它的方式,你的对象有一些共同的属性,以及一些可选的属性。 您可以使用@JsonAnyGetter@JsonAnySetter为可选属性@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映射中。

如果你不知道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>>(){});
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM