jackson 解析复杂json问题

jackson 解析复杂json问题

jackson常见的json生成和解析的工具包,下面一起看看它对于复杂的json解析时带来的问题

  • jackson简介
  • jackson依赖包
  • jackson解析javaBean
  • jackson解析泛型的List
  • jackson解析复杂的json

jackson简介

Jackson是一种JSON API,也是最流行,速度最快的JSON API。Jackson的在线API文档可以在http://wiki.fasterxml.com/JacksonInFiveMinutes中找到。Jackson的源代码托管在:https://github.com/FasterXML/jackson
Jackson提供了两种不同的JSON解析器:
ObjectMapper:把JSON解析到自定义的Java类中,或者解析到一个Jackson指定的树形结构中(Tree model)。
Jackson JsonParser:一种“拉式”(pull)解析器,每次解析一组JSON数据。
Jackson也包含了两种不同的JSON生成器:
ObjectMapper:把自定义的Java类,或者一个Jackson指定的树形结构生成为JSON文件。
Jackson JsonGenerator:每次只生成一组JSON数据。

jackson依赖包

Jackson包含一个core JAR,和两个依赖core JAR的JAR:
Jackson Core
Jackson Annotations
Jackson Databind
其中Jackson Annotations依赖Jackson Core,Jackson Databind依赖Jackson Annotations。
这三个JAR可以从Maven中央仓库下载,然后放在CLASSPATH中,也可以用Maven配置:

<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-databind</artifactId>  
      <version>${jackson-version}</version>  
</dependency>  
<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-core</artifactId>  
      <version>${jackson-version}</version>  
</dependency>  
<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-annotations</artifactId>  
      <version>${jackson-version}</version>  
</dependency>  

jackson解析javaBean

ProductBean.java

package cn.com.zckj;

/**
 * 
 * @ClassName: ProductBean
 * @Description: 实体类
 * @author deng
 * @date 2017年4月27日 下午3:38:26
 */
public class ProductBean {

    // 产品编号
    private int id;
    // 产品名称
    private String name;
    // 产品jiage
    private int price;


    public ProductBean() {
        super();
    }

    public ProductBean(int id, String name, int price) {
        super();
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "产品的id:" + id + ", 名字:" + name + ", 价格:" + price ;
    }

}

解析如下:

package cn.com.zckj;

import java.io.File;
import java.io.IOException;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 
* @ClassName: Demo4 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author deng
* @date 2018年4月17日 上午11:38:13
 *Jackson 生成和解析
 *
 */
public class Demo4 {

    public static void main(String[] args) {
        //对象-》 json
        //ProductBean productBean=new ProductBean(1, "aa", 222);
        ObjectMapper mapper = new ObjectMapper();
        try {
            mapper.writeValue(new File("data.txt"), productBean);
        } catch (IOException e) {
            e.printStackTrace();
        }


        //json - > 对象
        try {
            ProductBean productBean2  = mapper.readValue(new File("data.txt"), ProductBean.class);
            System.out.println(productBean2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

jackson解析List

package cn.com.zckj;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;


/**
 * 
* @ClassName: Demo5 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author deng
* @date 2018年4月18日 上午10:51:23
* 
* jackson转换list中有泛型的数据
 */
public class Demo5 {

    public static void main(String[] args) {

        ArrayList<ProductBean> productBeans = new ArrayList<ProductBean>();
        productBeans.add(new ProductBean(1, "a", 22));
        productBeans.add(new ProductBean(2, "b", 22));
        productBeans.add(new ProductBean(3, "c", 22));

        ObjectMapper mapper = new ObjectMapper();

        try {
            mapper.writeValue(new File("data.txt"), productBeans);
        } catch (IOException e) {
            e.printStackTrace();
        }



        //泛型的方式ArrayList<ProductBean> == javaType
        JavaType javaType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, ProductBean.class);  
        try {
            List<ProductBean> lst =  (List<ProductBean>)mapper.readValue(new File("data.txt"), javaType);
            for(ProductBean productBean : lst){
                System.out.println(productBean);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }  


        //普通的方式
        try {
            List<ProductBean> lst = mapper.readValue(new File("data.txt"), ArrayList.class);
            for(ProductBean productBean : lst){
                System.out.println(productBean);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

jackson解析复杂的json

ResultBean.java

package cn.com.zzkj;

import java.util.ArrayList;


/**
 * 
* @ClassName: ResultBean 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author deng
* @date 2018年4月19日 下午6:29:18
 */
public class ResultBean {

    private String code;
    private ArrayList<ProductBean> data;



    public ResultBean() {
        super();
        // TODO Auto-generated constructor stub
    }

    public ResultBean(String code, ArrayList<ProductBean> data) {
        super();
        this.code = code;
        this.data = data;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public ArrayList getData() {
        return data;
    }

    public void setData(ArrayList<ProductBean> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "ResultBean [code=" + code + ", data=" + data + "]";
    }
}

解析的方式

package cn.com.zzkj;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {
    public static void main(String[] args) {

        ObjectMapper objectMapper = new ObjectMapper();
        ArrayList<ProductBean> data = new ArrayList<ProductBean>();

        data.add(new ProductBean(2, "你", 2));
        data.add(new ProductBean(2, "你", 2));
        data.add(new ProductBean(2, "你", 2));
        ResultBean resultBean =new ResultBean("11",data);
        try {
            objectMapper.writeValue(new File("aa.txt"), resultBean);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //这里需要注意1.实体bean的结构必须与json中的数据结构一。2.实体bean中的数据名称必须与json中对应的关键词一至
        try {
            ResultBean resultBean2 = JackSonUtil.parse(ResultBean.class, new FileInputStream(new File("aa.txt")));
            ArrayList<ProductBean> a = resultBean2.getData();
            for(ProductBean productBean : a){
                System.out.println(productBean);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

依赖

jackson-annotations-2.5.0.jar
jackson-core-2.5.0.jar
jackson-core-asl-1.9.11.jar
jackson-databind-2.5.0.jar
jackson-mapper-asl-1.9.11.jar
stax2-api-3.1.1.jar

jar包和JackSonUtil工具类
JackSonUtil.java

package cn.com.zzkj;

import java.io.IOException;
import java.io.InputStream;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;


/**
 * 
 * @since 2014/10/25 18:33
 * @version 1.0 这里需要注意1.实体bean的结构必须与json中的数据结构一。2.实体bean中的数据名称必须与json中对应的关键词一至
 * 
 */
public class JackSonUtil {
    /**
     * @param clazz
     *            需要解析成的bean类型 改bean类型必须实现Serializable接口
     * @param is
     *            json的输入流
     * @return 返回解析成的bean对象 例: Djl p = JackSonUtil.parse(Djl.class, is);
     */
    public static <T> T parse(Class<T> clazz, InputStream is) {
        ObjectMapper mapper = new ObjectMapper().setVisibility(
                JsonMethod.FIELD, Visibility.ANY);
        T result = null;
        try {
            /**
             * true可以设置私有变量
             */
            mapper.configure(
                    DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
                    true);
            /**
             * 与未定义的属相有关
             */
            mapper.configure(
                    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
                    false);
            result = mapper.readValue(is, clazz);
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * @param clazz
     *            需要解析成的bean类型 改bean类型必须实现Serializable接口
     * @param json
     *            json文本
     * @return 返回解析成的bean对象 例: Djl p = JackSonUtil.parse(Djl.class, is);
     */
    public static <T> T parse(Class<T> clazz, String json) {
        ObjectMapper mapper = new ObjectMapper().setVisibility(
                JsonMethod.FIELD, Visibility.ANY);
        T result = null;
        try {
            /**
             * true可以设置私有变量
             */
            mapper.configure(
                    DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
                    true);
            /**
             * 与未定义的属相有关
             */
            mapper.configure(
                    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
                    false);
            result = mapper.readValue(json, clazz);
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return result;
    }
}

有了 这种方式,任何复杂的json都可以解析但是注意的是这里需要注意1.实体bean的结构必须与json中的数据结构一。2.实体bean中的数据名称必须与json中对应的关键词一至,祝你好运

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值