JSON 反序列化问题:将 JSON 值反序列化为类型时出错

JSON Deserialization issue : Error deserialize JSON value into type

我有一个如下所示的复合对象:

Map<String, Object> m = new HashMap<>();
m.put("a", "b");
m.put("c", "{\"a\" :3, \"b\" : 5}");

           
m = {a=b, c={"a" :3, "b" : 5}}

我必须通过 https 调用提交此请求才能反序列化为 java 对象,因此我将其转换为 JSON 字符串,使用

objectmapper.writeValueAsString(m)

当我转换它时,它会在 c:

的值上附加引号
{"a":"b","c":"{\"a\" :3, \"b\" : 5}"}

并且在客户端反序列化这个对象时,请求失败说 “将 JSON 值反序列化为类型时出错:class”

有帮助吗??

C 的类型是字符串,因此对象映射器转义了所有非法字符,将字符串用引号括起来。

您可以制作 C 另一张地图:

Map<String, Object> c = new HashMap<>();
c.put("a", 3);
c.put("b", 5);

Map<String, Object> m = new HashMap<>();
m.put("a", "b");
m.put("c", c);

或者您可以创建自定义 POJO 并使用 @JsonRawValue 注释:

public class MyPojo{

   private String a;

   @JsonRawValue
   private String c;

   // getter and setters
}

MyPojo m = new MyPojo();
m.setA("b");
m.setB("{\"a\" :3, \"b\" : 5}");

objectmapper.writeValueAsString(m);

来自documentation

Marker annotation that indicates that the annotated method or field should be serialized by including literal String value of the property as is, without quoting of characters. This can be useful for injecting values already serialized in JSON or passing javascript function definitions from server to a javascript client. Warning: the resulting JSON stream may be invalid depending on your input value.

客户端错误的意思可能是它无法将字符串反序列化为对象(它期望 { 而不是 ")。

您最好使用 JSONObject 作为 c 值:

JSONObject json = new JSONObject();
json.put("a", 3);
json.put("b", 5);

Map<String, Object> m = new HashMap<>();
m.put("a", "b");
m.put("c", json);

完整代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.minidev.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

public static void main(String[] args) throws JsonProcessingException {

    JSONObject json = new JSONObject();
    json.put("a", 3);
    json.put("b", 5);

    Map<String, Object> m = new HashMap<>();
    m.put("a", "b");
    m.put("c", json);


    ObjectMapper objectMapper = new ObjectMapper();
    String valueAsString = objectMapper.writeValueAsString(m);

    System.out.println(valueAsString);
}

输出为:

{"a":"b","c":{"a":3,"b":5}}