Java Jackson的使用

1、注意:

1、使用封装在类 JsonUtil中

2、使用中必须设置的属性

//此属性一般配置上:String转对象时,如果String定义的字段在对象中不存在,则会报错,具体错误参照第5点。

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

2、Pom引用3个架包

注意:<!-- 请根据实际需要选择版本 -->

    <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-databind</artifactId>

            <version>2.15.2</version>

        </dependency>

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-core</artifactId>

            <version>2.15.2</version>

        </dependency>

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-annotations</artifactId>

            <version>2.15.2</version>

        </dependency>

3、使用

1)、封装成一个全局变量

public class JsonUtil {

    /**

     * 1、ObjectMapper 是线程安全的,可以被多个线程共享使用。

     * 2、创建 ObjectMapper 是一个相对昂贵的操作,因为它需要初始化各种配置(如模块、序列化设置等)。频繁创建新的 ObjectMapper 实例会影响性能。

     */

    private static final ObjectMapper objectMapper = new ObjectMapper();



    static {

        //自定义配置

        //设置没有字段忽略,而不是报错。String转对象时,如果String定义的字段在对象中不存在,则会报:

        // java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "message2"

        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        //objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    }



    public static ObjectMapper getObjectMapper() {

        return objectMapper;

    }

}

2)、spring boot则可以定义成Bean

@Configuration

public class JacksonConfig {

    @Bean

    public ObjectMapper objectMapper() {

        ObjectMapper objectMapper = new ObjectMapper();

        // 自定义配置

        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        //objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        return objectMapper;

    }

}

使用时直接通过依赖注入获取 ObjectMapper:

@Autowired

private ObjectMapper objectMapper;

4、调用例子

public static void main(String[] args) {

        HttpResult result = new HttpResult();

        result.setStatus(true);

        result.setCode("200");

            //获取对象

        ObjectMapper objectMapper = JsonUtil.getObjectMapper();

        try {

                     //对象转string

            String objStr = objectMapper.writeValueAsString(result);

            IPrintUtil.print(objStr);

        } catch (JsonProcessingException e) {

            throw new RuntimeException(e);

        }

            //String 转对象

        String jsonValue = "{\"status\":true,\"code\":\"200\",\"message\":null,\"message2\":null}";

        try {

            HttpResult  sk = objectMapper.readValue(jsonValue,HttpResult.class);

            IPrintUtil.print(sk);

        } catch (JsonProcessingException e) {

            throw new RuntimeException(e);

        }

        IPrintUtil.print("finished!");

    }

5、抛错信息

增加不必填的属性即可。

Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "message2" (class com.ssdemo.domain.HttpResult), not marked as ignorable (4 known properties: "status", "code", "message", "errorMessage"])

 at [Source: (String)"{"status":true,"code":"200","message":null,"message2":null}"; line: 1, column: 59] (through reference chain: com.ssdemo.domain.HttpResult["message2"])

  at com.ssdemo.utils.HttpUtils.main(HttpUtils.java:246)

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "message2" (class com.ssdemo.domain.HttpResult), not marked as ignorable (4 known properties: "status", "code", "message", "errorMessage"])

 at [Source: (String)"{"status":true,"code":"200","message":null,"message2":null}"; line: 1, column: 59] (through reference chain: com.ssdemo.domain.HttpResult["message2"])

  at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)

  at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1138)

  at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2224)

  at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1709)

  at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1687)

  at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:320)

  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)

  at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)

  at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4825)

  at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3772)

  at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3740)

  at com.ssdemo.utils.HttpUtils.main(HttpUtils.java:243)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值