java - JSON 反序列化问题:将 JSON value 反序列化为类型时出错

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

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

https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonRawValue.html

标记注释,指示注释的方法或字段应按原样包含属性的文字字符串 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}}

相似文章

c++ - 神秘的数组和函数?

我正在制作这个chess引擎,嗯,试图制作一个chess引擎。不断出现的一些令人困惑的事情是这些看似任意的从0到63的数字数组,所谓的“DeBruijn序列”以及互联网上似乎没有人完全理解的函数。有人...

最新文章