为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析“{}”空值(转换为字符串)

如何解析“{}”空值(转换为字符串)

MM们 2022-05-25 17:31:28
给定json:{  "name" : {}}我想将其解析为以下 Java 对象com.fasterxml.jackson:class MyClass {  private String name;}如果你尝试一下,你会得到:com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token有什么方法可以配置杰克逊反序列化器(最好是全局),它可以empty objects在nulls不更改属性类型(来自字符串)的情况下处理这些?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

为此,您可以编写自己的反序列化器。在此之后,您扩展 StdDeserializer 并将其注册到类中。


作者编辑:


我已经为字符串使用了以下反序列化器,它工作正常,谢谢:


public class EmptyObjectDeserializer extends StdDeserializer<String> {


    public EmptyObjectDeserializer() {

        this(null);

    }


    public EmptyObjectDeserializer(Class<?> vc) {

        super(vc);

    }


    @Override

    public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {

        JsonNode node = jp.getCodec().readTree(jp);

        return node.asText("");

    }

}


查看完整回答
反对 回复 2022-05-25
?
精慕HU

TA贡献1845条经验 获得超8个赞

在 json 中,{}is anObject意味着它可以有字段(就像 Java 中的 POJO)。当您尝试将其反序列化为 aString时,它会引发异常(想象一下尝试将 POJO 分配给 Java 中的 String 引用)。


在这种情况下,有两种选择:


将您的课程配置为不包含空字段。这可以通过ObjectMapper实例上的注释或配置来完成,例如:


@JsonInclude(Include.NON_NULL)

class MyClass {

  private String name;

}

或者


mapper.setSerializationInclusion(Include.NON_EMPTY);


如果响应中没有 null,则此选项可能不起作用name。如果它是一个非空值的对象,Jackson 将尝试将其反序列化为 aString并失败。


将类型更改name为Object(或者更确切地说,是响应可以包含的所有元素的 POJO)。但是,这意味着您需要更改访问name元素的代码,因为它不再是String.


查看完整回答
反对 回复 2022-05-25
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

无需编写自己的反序列化器,只需将名称对象封装在一个类中即可:


@JsonInclude(JsonInclude.Include.NON_NULL)

@JsonPropertyOrder({

        "name"

})

public class JsonExample {

        @JsonProperty("name")

        public Name name;

}


@JsonInclude(JsonInclude.Include.NON_NULL)

@JsonPropertyOrder({

        "first",

        "last"

})

public class Name {

    @JsonProperty("first")

    public String first_name;

    @JsonProperty("last")

    public String last_name;

}

这里以名字和姓氏为例...不知道 Name 对象中的内容,因此您可以使用映射器:


JsonExample obj = mapper.readValue(file, JsonExample.class);


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号