在JSON中发布API时,如何在其值中正确发送包含双打和字符串的HashMap

时间:2017-04-24 21:38:28

标签: java json spring rest resttemplate

我使用Springs rest模板将一些JSON数据发布到API。不幸的是,我的HashMap的值包含双精度和字符串。

我尝试使用具有以下数据类型的HashMap:HashMap,但是我发现生成的JSON看起来类似于以下内容:

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.CommonsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

不幸的是,我发布的API并没有正确处理这两个,因为它们是作为字符串发送的。是否有一些我仍然可以对数据类型不可知,但HttpEntity格式正确加倍。

以下是我实际使用的代码示例:

public void postMethod(HashMap<String,Object> input) {

    CommonsClientHttpRequestFactory requestFactory = new CommonsClientHttpRequestFactory();
    restTemplate.setRequestFactory(requestFactory);
    HttpEntity<HashMap<String,Object>> requestEntity = new HttpEntity<>(input, headers);

    ResponseEntity<Result> result = restTemplate.postForEntity(uri, requestEntity, Result.class);
    Result result = result.getBody();
}

...

JOIN

1 个答案:

答案 0 :(得分:1)

您可以通过直接访问Spring使用的Jackson库来创建自定义JSON主体:

import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;

...

public void postMethod(HashMap<String,Object> input) {
    ObjectNode jsonBody = JsonNodeFactory.instance.objectNode();
    for (Map.Entry<String, Object> entry : input.entrySet())
    {
        String key = entry.getKey();
        Object value = entry.getValue();

        if (value instanceof Double)
            jsonBody.put(key, (Double)value);
        else if (value instanceof Boolean)
            jsonBody.put(key, (Boolean)value);
        else
            jsonBody.put(key, value);
    }

    // ... make headers ...

    HttpEntity<String> requestEntity = new HttpEntity<>(jsonBody.toString(), headers);

    // ... make the post request ...
}

唯一愚蠢的部分是你必须在调用value之前强制转换put(),否则Java会调用put(String, Object)方法覆盖。