我有一个复合对象,如下所示:
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 的 value 中:
{"a":"b","c":"{\"a\" :3, \"b\" : 5}"}
并且在客户端反序列化此对象时,请求失败说“错误将 JSON value 反序列化为类型:类”
有什么帮助吗??
回答1
value C
的类型是字符串,因此对象映射器会转义所有非法字符并将字符串用引号括起来。
你可以把 C
变成另一个 map:
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);
标记注释,指示注释的方法或字段应按原样包含属性的文字字符串 value 进行序列化,而无需引用字符。这对于注入已在 JSON 中序列化的 values 或将 javascript 函数定义从服务器传递到 javascript 客户端非常有用。警告:生成的 JSON 流可能无效,具体取决于您的输入 value。
客户端错误的含义可能是它无法将字符串反序列化为对象(它需要 {
而不是 "
)。
回答2
您最好将 JSONObject
用于 c
value:
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}}