使用Jackson将json转换为对象

本文介绍了如何使用Jackson库将JSON字符串转换为Java对象。在处理过程中,由于字段命名不遵循驼峰命名法以及存在数组,通过注解和创建额外的对象解决了这些问题。详细介绍了创建的entity和exampleEntity实体类,并提供了JSON处理的代码示例。

Jackson在以前的工作中都没用到过,这次机缘巧合之下使用了Jackson,就记录一下使用的过程,方便日后查看。
这次的需求很简单,就是将一段json进行处理,获得中间的数据,以往都是会直接使用com.alibaba.fastjson.JSONObject下面的JSON.parseObject()发法,但是这次看了一下项目中的pom.xml,只有jackson的以下三个依赖的jar包

		<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.10.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.10</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.10</version>
        </dependency>

确定了使用Jackson以后就要考虑怎么处理这段json,因为有些字段设计到业务场景,所以就用abc代替了,也方便

{
  "RetCd": "0",
  "RetMsg": "成功",
  "UserInfStrct": {
    "number": 123,
    "phone": "456",
    "NotesUserGrpArry": [{
      "a": "1",
      "b": "2",
      "c": "3"
    },
      {
        "a": "4",
        "b": "5",
        "c": "6"
      }
    ]
  }
} 

难点在于两点:
1、很多字段的命名没有遵循驼峰命名法,但是Jackson处理是会按照驼峰来处理的,所以需要多处理一步;
2、中间有一个数组,所以只使用一个对象就不太够
解决方案其实也不难:
1、使用@JsonProperty注解,具体的使用方法可以参考一下后面创建的实体类中的使用;
2、将数组中的abc再创建一个对象就完事了
所以,我创建了两个对象,首先是数组对象entity.java

package com.xhc.kuangstudyspringbootpro;

/**
 * @author :haoc.xu
 * @date :2021/8/3 15:19
 * @Description:
 */
public class entity {
    private String a;
    private String b;
    private String c;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = c;
    }

    @Override
    public String toString() {
        return "entity{" +
                "a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                '}';
    }
}

然后是整个的对象exampleEntity.java,因为json中的RetCdRetMsg很容易就get出来了,所以就不写在里面了
说实话,因为是写个小例子,所以命名其实是很不规范的,真正的开发中还是应该做到见名知意。

package com.xhc.kuangstudyspringbootpro;

import com.fasterxml.jackson.annotation.*;

import java.util.List;

/**
 * @author :haoc.xu
 * @date :2021/8/3 14:45
 * @Description:
 */
public class exampleEntity {
    private String number;
    @JsonProperty(value = "NotesUserGrpArry")
    private List<entity> notesUserGrpArry;
    private String phone;

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public List<entity> getNotesUserGrpArry() {
        return notesUserGrpArry;
    }

    public void setNotesUserGrpArry(List<entity> notesUserGrpArry) {
        this.notesUserGrpArry = notesUserGrpArry;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "exampleEntity{" +
                "number='" + number + '\'' +
                ", notesUserGrpArry=" + notesUserGrpArry +
                ", phone='" + phone + '\'' +
                '}';
    }
}

PS:
在这里插入图片描述
没有这个注释,这一步转化,妥妥报错,亲测!!!!
接下来就是对json进行处理了,同样为了偷懒,我直接把json复制到了代码里面

package com.xhc.kuangstudyspringbootpro;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.JSONObject;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author :haoc.xu
 * @date :2021/8/3 14:06
 * @Description:
 */

@RequestMapping(value = "/jsonTset",produces = "application/json;charset=utf-8")
public class jsonTset {
    public static void main(String[] args) throws Exception {
        String json = "{\n" +
                "\t\"RetCd\": \"0\",\n" +
                "\t\"RetMsg\": \"成功\",\n" +
                "\t\"UserInfStrct\": {\n" +
                "\t\t\"number\": 123,\n" +
                "\t\t\"phone\": \"456\",\n" +
                "\t\t\"NotesUserGrpArry\": [{\n" +
                "\t\t\t\t\"a\": \"1\",\n" +
                "\t\t\t\t\"b\": \"2\",\n" +
                "\t\t\t\t\"c\": \"3\"\n" +
                "\t\t\t},\n" +
                "\t\t\t{\n" +
                "\t\t\t\t\"a\": \"4\",\n" +
                "\t\t\t\t\"b\": \"5\",\n" +
                "\t\t\t\t\"c\": \"6\"\n" +
                "\t\t\t}\n" +
                "\t\t]\n" +
                "\t}\n" +
                "} ";
        JSONObject jsonObject = new JSONObject(json);
        System.out.println(jsonObject);
        String userInfStrct = jsonObject.get("UserInfStrct").toString();
        System.out.println(userInfStrct);
        ObjectMapper mapper = new ObjectMapper();
        exampleEntity exampleEntity = mapper.readValue(userInfStrct, exampleEntity.class);
        System.out.println(exampleEntity);
        List<entity> notesUserGrpArry = exampleEntity.getNotesUserGrpArry();
        for (entity entity : notesUserGrpArry) {
            System.out.println("a="+entity.getA()+",b="+entity.getB()+",c="+entity.getC());
        }
    }
}

为了能更清楚的了解中间的过程,在除了使用debug模式之外,我还贴心的多加了几个sout
运行效果如下,可以清楚的看到,我们已经处理完了,后续对对象进行处理就很简单了,在此就不多做赘述了
在这里插入图片描述

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值