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

当单元测试通过时,Spring Jackson ObjectMapper无法进行JSON反序列化

艾弘义
2023-03-14
@Value // or @Data Lombok
public class Bar {
    private final BigDecimal value;

    @JsonCreator
    public Bar(double value) {
        this.value = BigDecimal.valueOf(value);
    }
}

我编写了一个通过的单元测试:

@Test
void test() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    Bar bar = new Bar(12.34);
    assertEquals(mapper.readValue("12.34", Bar.class), bar);
}

但是当我向控制器发送POST时,它无法反序列化请求正文(它只是12.34要反序列化为Bar实例),出现以下错误:

JSON解析错误:无法构造com.example.demo.bar的实例(尽管至少存在一个创建者):没有双/双参数构造函数/工厂方法可以从数字值反序列化(12.34);嵌套异常是com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.example.demo.bar的实例(尽管至少存在一个创建者):没有从数字值反序列化的双/双参数构造函数/工厂方法(12.34)

共有1个答案

彭高畅
2023-03-14

@jsoncreator应与@jsonproperty一起使用,以指定如何反序列化JSON对象。例如,如果您有一个JSON喜欢的rest控制器:

{
  "value": 123
}

您的构造函数应该这样注释:

@JsonCreator
public Bar(@JsonProperty("value") double value) {
    this.value = BigDecimal.valueOf(value);
}

尽管这可能是多余的,但其思想是,当您打算反序列化的JSON与您的属性名称不匹配时,这允许更灵活的操作。

public class Example {
    private final BigDecimal myValue;

    @JsonCreator
    public Bar(@JsonProperty("value") double myValue) {
        this.myValue= BigDecimal.valueOf(myValue);
    }
}
 类似资料:
  • 问题内容: 我应该如何反序列化以下JSON以跳过根元素并仅解析此JSON的内部。我想避免创建其他仅包含字段的3rd类。 因此,我只希望有以下两个类: 问题答案: 您可以为此使用库。 下面的代码将解决您的问题。

  • 问题内容: 我正在使用一个Android应用程序,该应用程序是从Web服务下载JSON数据的。解析数据的类如下所示: 当我从应用程序内部调用时,它构建良好并且可以正常工作,但是当我尝试在单元测试中测试此方法时,出现以下异常: 默认情况下,Android框架随附的软件包的类似乎在Java中不可用。 有没有一种方法可以解决此问题,以便可以对解析JSON的类进行单元测试? 问题答案: 您需要做的就是将以

  • Android 进行单元测试难在哪-序 原文链接 : Against Android Unit Tests 原文作者 : Matthew Dupree 译文出自 : 开发技术前线 www.devtf.cn 译者 : chaossss 校对者: Rocko 状态 : 完成 其实不仅仅只有普通 Android 开发工程师觉得测试 Android 应用很恼火,大牛们也受此困扰已久。例如 Jake Wha

  • 这很奇怪,我不知道该如何解释清楚。请耐心听我说,请查看代码片段以了解详细信息。 我使用枚举实现了一个单例。枚举有一个私有构造函数,在构造对象之前,我只在其中执行很少的操作和验证。对于所有这些验证,我将抛出一些异常(如IllegalArgumentException)。 我的测试用例包括针对负面和正面场景的测试。每当有两个以上的测试用例混合了负面和正面的测试用例时,我就会得到以下异常:。请检查下面的

  • 问题内容: 这是我的课 最初的一个实际上需要转换为良好的json数据。这是最初的坏人 这是我的json数据,我无法反序列化。即使更改,我仍会收到默认值 我的自定义封面 问题答案: 您可以使用json.net以显示的格式对a进行反序列化和重新序列化,只要您使用custom即可。这是必需的,因为默认情况下,对象集合在JSON数组之间进行序列化,但是在JSON中,对象集合以单个对象的紧凑形式进行序列化,