当前位置: 首页 > 知识库问答 >
问题:

JsonMappingException-字段名中包含意外字符

管景天
2023-03-14

我试图反序列化JSON的格式

"{mapping:{MyType(type=\"A\", value=\"B\"):\"C\"}}"

类类型

class MyMapping {
    Map<MyType, String> mapping;
}

class MyType {
    String type;
    String value; 
}

因为我有一个映射类型,所以我添加了一个键反序列化器来反序列化MyType(type=\'a\',value=\'B\”

但是当我尝试反序列化时,我得到了一个异常

Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('(' (code 40)): was expecting a colon to separate field name and value

这是因为它遇到了MyType(type=\'A\',value=\'B\')中,它在那里中断。如果我将整个键放在双引号\'MyType(type=\'A\',value=\'B\')\中,它会将整个键传递给我的反序列化程序。

有没有一种方法,我可以迫使它转义'('char,而不必把整个关键与引号。

共有1个答案

楚浩然
2023-03-14

示例中的字符串不是有效的JSON。

"{映射:{MyType(type=\"A\", value=\"B\"):\"C\"}}"

您指出Jackson解析器抱怨第一个(

如果您想使用这个特定的字符串作为键,您必须将其括在引号中并转义内部引号。让我们在浏览器中使用Javascript来做到这一点,因为这很容易。从Chrome控制台...

> var c = {};
< undefined
> c['MyType(type="A", value="B")']='C';
< "C"
> JSON.stringify(c)
< "{"MyType(type=\"A\", value=\"B\")":"C"}"`

这就是Javascript如何将您的密钥字符串转义为有效的JSON。

密钥解析器

基于杰克逊2.8留档为KeyDeserializer我希望你的KeyDeserializer接收整个关键字串。这就是JSON的工作原理。

{"key-string":"value")

当然,“value”可以是false、true、null或数字。

然后由你来解析关键字串,并决定如何将其转化为你的我的映射可以使用的关键字。

您的密钥字符串看起来很容易解析

您的KeyDeserializer可以使用已编译的正则表达式模式将两个键属性作为两个正则表达式“组”获取。

如果您不想解析关键字串怎么办?

听起来你不想解析这个键。有几种方法可以避免这种情况。其中一个关键点是使用JSON格式,使其变得简单,例如。。。

{“键”:{“键类型”:“A”,“键值”:“B”},“值”:“C”}

然后,您可以使用注释来教杰克逊使用您的My映射类。

例如(未经测试,仅为草图)

class MyMapping {
    Map<MyType, String> mapping;
    @JsonCreator
    public MyMapping(Map<String,Object> input) {
        Map<String,Object> key = (Map)input.get("key");
        String value = (String)input.get("value");
        MyType myKey = new MyType(key);
        mapping = new HashMap<>();
        mapping.put(myKey,value);
    }
}

class MyType {
    String type;
    String value; 
    MyType (Map<String,Object> input) {
        type = (String)input.getOrDefault("key","");
        value = (String)input.getOrDefault("value","");
    }
}

这个例子有一长串问题。例如,您将在Map中使用默认的基于对象地址的比较。我通过忽略可能的ClassCastExceptions和其他数据问题来缩短这段代码。但是这里的重点不是写好代码,或者试图理解需求,而是简单地指出如何让杰克逊为你解析JSON。

有很多。实现这一目标的其他途径。我只是。挑了第一个想到的。

 类似资料:
  • 问题内容: 有人可以帮我弄这个吗。 我有我的选择查询 我想要选择查询的内容,并在下载csv文件时包含标题,因此我执行了以下查询: 但这给了我这个错误 我想在我下载的csv文件中有这样的输出: 先感谢您。 问题答案: 如错误所示:来自查询的词典包含的键多于您在DictWriter构造函数中指定的字段名称。 一种解决方案是提前对其进行过滤,如下所示: 另一种解决方案是仅使用那些字段来构造查询: 但是,

  • 问题内容: 我正在使用multer npm模块将文件上传到我的应用程序。 我定义的multer功能是允许将一个文件上传到文件系统。运行期间一切正常;问题是我上传文件后出现以下错误。任何建议赞赏在哪里看。 app.js 索引库 问题答案: 我们必须确保具有name属性的type =文件应与传入的参数名称相同

  • 我正在寻找一个运算符,它允许我检查字段的值是否包含某个字符串。 比如: 可能吗?

  • 问题内容: 在MySQL中,使用LIKE非常普遍。我们使用它是这样的:。我们有一个子字符串,而字段有完整的字符串。但是我需要的是相反的东西。我在字段中有子字符串。因此,我希望该行包含我的字符串的子字符串。假设表是: 而且我有一个来自用户的字符串:。我需要返回这样的MySQL查询,因为这是用户字符串的子字符串。就像是: 提前致谢。 问题答案: 您在寻找LIKE运算子 模式匹配使用SQL简单的正则表达

  • 我正在使用multer npm模块将文件上传到我的应用程序。 我定义的multer功能是允许将单个文件上载到文件系统。一切都在运行时工作;问题是在我上传文件后,我在下面遇到了一个错误。任何关于去哪里看的建议都很感激。

  • 问题内容: 由于某种原因,我收到一条错误消息,但是实际上并没有在读取的任何代码中加下划线。我尝试清洁和重建它,但是没有用。它说它在第49行。 我的代码如下 下面的第49行 问题答案: 你内有两个“奇数”字- U + 200C (零宽不连字)和U + 200B (零宽度的空间)的第一个“e”和“m”个之间。“ l”和“ i”之间的“点击”中出现相同的字符。 只需删除并重新输入这些单词,错误就会消失。