Java解析json(一):json-lib

定义

Json-lib 是一个 Java 类库(官网:http://json-lib.sourceforge.net/)。提供将Java对象,包括beans, maps, collections, java arrays 和 XML等转换成JSON格式数据,或者反向转换的功能,将 json 格式数据转换为 javabeans 对象。

所需jar包

  • commons-beanutils-1.8.3.jar
  • commons-collections-3.2.1.jar
  • commons-lang-2.6.jar
  • commons-logging-1.1.1.jar
  • ezmorph-1.0.6.jar
  • json-lib-2.4-jdk15.jar

主要API

JSONObject.fromObject()

Map、自定义类型是用JSONObject解析 。可以将Map理解成一个对象,里面的key/value对可以理解成对象的属性/属性值 即{key1:value1,key2,value2……}

JSONArray.fromObject()

普通类型、List、Collection等都是用JSONArray解析

jsonObject.toBean

将json字符串转为对象

案例

普通类型转换成JSON

/**
  * @author NowUSeeMe
  */
  @Test
 public void CommonType2Json(){
   Integer myInt = 11;
   System.out.println("用JSONObject转换普通整型(包装类):"+JSONObject.fromObject(myInt)); //{}
   System.out.println("用JSONArray转换普通整型(包装类):"+JSONArray.fromObject(myInt)); //[11]
   boolean flag = false;
   System.out.println("用JSONObject转换普通布尔类型:"+JSONObject.fromObject(flag)); //{}
   System.out.println("用JSONArray转换普通布尔类型:"+JSONArray.fromObject(flag)); //[false]
  }

 @Test
 public void JsonStr2Json(){
   String str = "['json','is','easy']";
   JSONArray jsonArray = JSONArray.fromObject(str);  
   System.out.println("jsonArray:" +  jsonArray );  //jsonArray:["json","is","easy"]
  }

数组转换成JSON

/**
 * @author NowUSeeMe
 */
@Test
 public void Array2Json(){
   boolean[] boolArray = new boolean[]{true, false, true};
   JSONArray jsonArray = JSONArray.fromObject(boolArray);
   System.out.println("Array2Json:" + jsonArray);//Array2Json:[true,false,true]
  }

数组转换成JSON

 /**
  * @author NowUSeeMe
  */
  @Test
   public void List2Json(){
       List<String> list = new ArrayList<String>();
       list.add("NowUSeeMe");
       list.add("LXX");
       JSONArray jsonArray = JSONArray.fromObject(list);
       System.out.println("List2Json:" +  jsonArray); //List2Json:["NowUSeeMe","LXX"]
   }

Map转换成JSON

@Test
  public void Map2Json(){
       Map<String, Object> map = new HashMap<String, Object>();
       map.put("name", "NowUSeeMe");
       map.put("age", 20);
       map.put("isMan", true);
       map.put( "bool", Boolean.TRUE );  
       map.put( "int", new Integer(1) );  
       map.put( "arr", new String[]{"a","b"} );  
       map.put( "func", "function(i){ return this.arr[i]; }" );
       JSONObject jsonObject = JSONObject.fromObject(map);
       System.out.println("Map2Json"+jsonObject);
       System.out.println("从JsonObject中取出数组:"+jsonObject.optString("arr"));
       System.out.println("从JsonObject中根据key取出value:" + jsonObject.get("age"));
   }

运行结果:

Map2Json{"arr":["a","b"],"int":1,"age":20,"name":"NowUSeeMe","func":function(i){ return this.arr[i]; },"bool":true,"isMan":true}
从JsonObject中取出数组:["a","b"]
从JsonObject中根据key取出value:20

复杂Bean转Json

Card.java

public class Card {
    private Integer id;
    private String cardName;
    private String cardNum;
    private String cardHolder;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    public String getCardName() {
        return cardName;
    }
    public void setCardName(String cardName) {
        this.cardName = cardName;
    }
    public String getCardNum() {
        return cardNum;
    }
    public void setCardNum(String cardNum) {
        this.cardNum = cardNum;
    }
    public String getCardHolder() {
        return cardHolder;
    }
    public void setCardHolder(String cardHolder) {
        this.cardHolder = cardHolder;
    }

}

Account.java

import java.util.Date;
import java.util.List;

public class Account{
    private String  userName;
    private Integer age;
    private Date createTime;
    private List<Card> cards;
    public Account(){};
    public Account(String  userName, Integer age, Date createTime){
        this.userName = userName;
        this.age = age;
        this.createTime = createTime;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public List<Card> getCards() {
        return cards;
    }
    public void setCards(List<Card> cards) {
        this.cards = cards;
    }
}

测试:

 /**
  * @author NowUSeeMe
  */
@Test
   public void ComplexBean2Json(){
       Card card1 = new Card();
       card1.setId(1);
       card1.setCardName("中国工商银行");
       card1.setCardNum("123456789");
       card1.setCardHolder("nowu");

       Card card2 = new Card();
       card2.setId(2);
       card2.setCardName("中国农业银行");
       card2.setCardNum("845612345");
       card2.setCardHolder("seeme");   

       List<Card> cards = new ArrayList<Card>();
       cards.add(card1);
       cards.add(card2);       
       Account complexBean = new Account();
       complexBean.setUserName("accountName");
       complexBean.setAge(20);
       complexBean.setCards(cards);
       complexBean.setCreateTime(new Date());      
       JSONObject jsonObject = JSONObject.fromObject(complexBean);  //这里JSONObject(推荐) JSONArray都可以
       System.out.println(jsonObject);     
   }

运行结果:

{"age":20,"cards":[{"cardHolder":"nowu","cardName":"中国工商银行","cardNum":"123456789","id":1},{"cardHolder":"seeme","cardName":"中国农业银行","cardNum":"845612345","id":2}],"createTime":{"date":18,"day":6,"hours":13,"minutes":27,"month":1,"seconds":40,"time":1487395660727,"timezoneOffset":-480,"year":117},"userName":"accountName"}

增加忽略的属性

若是觉得以上结果太杂,想要自定义序列化的结果,有两种方法:
1. 可以在想要序列化的实体类Account.java 中实现JsonString接口并实现该接口方法,在该方法中自定义序列化。
2. 过jsonconfig实例,对包含和需要排除的属性进行方便的添加或删除

方法1:序列化的Bean实现JsonString接口

修改Account.java

package com.myjsonlib.demo2;

import java.util.Date;
import java.util.List;

import net.sf.json.JSONString;

public class Account implements JSONString{
    private String  userName;
    private Integer age;
    private Date createTime;
    private List<Card> cards;
    public Account(){};
    public Account(String  userName, Integer age, Date createTime){
        this.userName = userName;
        this.age = age;
        this.createTime = createTime;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public List<Card> getCards() {
        return cards;
    }
    public void setCards(List<Card> cards) {
        this.cards = cards;
    }
    @Override
    public String toJSONString() {
        return "{\"userName\":\"" + this.userName + "\",\"age\":" + this.age+",\"createTime\":\"" + this.createTime + "\"}";
    }
}

输出结果:

{"userName":"accountName","age":20,"createTime":"Sat Feb 18 13:54:38 CST 2017"}

方法2:属性过滤器jsonconfig排除属性

Account.java不变,不需要实现JsonString接口。在序列化方法中添加一个jsonConfig参数,即排除需要忽略的属性即可。JSONObject.fromObject(complexBean,jsonConfig);

JsonConfig.setExcludes(String[] excludes)
 /**
  * @author NowUSeeMe
  */
@Test
 public void  JsonConfig(){
   Card card1 = new Card();
   card1.setId(1);
   card1.setCardName("中国工商银行");
   card1.setCardNum("123456789");
   card1.setCardHolder("nowu");

   Card card2 = new Card();
   card2.setId(2);
   card2.setCardName("中国农业银行");
   card2.setCardNum("845612345");
   card2.setCardHolder("seeme");


   List<Card> cards = new ArrayList<Card>();
   cards.add(card1);
   cards.add(card2);

   Account complexBean = new Account();
   complexBean.setUserName("accountName");
   complexBean.setAge(20);
   complexBean.setCards(cards);
   complexBean.setCreateTime(new Date());
   JsonConfig jsonConfig = new JsonConfig();
   String[] excludes ={"cards"};
   jsonConfig.setExcludes(excludes);
   JSONObject jsonObject = JSONObject.fromObject(complexBean,jsonConfig);  //这里JSONObject(推荐) JSONArray都可以
   System.out.println(jsonObject);
  }

运行结果:

{"age":20,"createTime":{"date":18,"day":6,"hours":14,"minutes":28,"month":1,"seconds":10,"time":1487399290394,"timezoneOffset":-480,"year":117},"userName":"accountName"}
JsonConfig..setJsonPropertyFilter(new PropertyFilter() {})
 /**
  * @author NowUSeeMe
  */
  @Test
  public void  JsonConfig(){
   Card card1 = new Card();
   card1.setId(1);
   card1.setCardName("中国工商银行");
   card1.setCardNum("123456789");
   card1.setCardHolder("nowu");

   Card card2 = new Card();
   card2.setId(2);
   card2.setCardName("中国农业银行");
   card2.setCardNum("845612345");
   card2.setCardHolder("seeme");


   List<Card> cards = new ArrayList<Card>();
   cards.add(card1);
   cards.add(card2);

   Account complexBean = new Account();
   complexBean.setUserName("accountName");
   complexBean.setAge(20);
   complexBean.setCards(cards);
   complexBean.setCreateTime(new Date());
   JsonConfig jsonConfig = new JsonConfig();
   //设置属性过滤器,是否应用某字段
   jsonConfig.setJsonPropertyFilter(new PropertyFilter() {
       /**
        * @param Object source  属性的拥有者 
        * @param String name 属性名字
        * @param Object value 属性值
        */
       @Override
       public boolean apply(Object source, String name, Object value) {
          return source instanceof Account、 && "cards".equalsIgnoreCase(name);
       }
    });


   JSONObject jsonObject = JSONObject.fromObject(complexBean,jsonConfig); 
   System.out.println(jsonObject);
  }
注册JsonBeanProcessor

jsonConfig.registerJsonBeanProcessor(Class class, new JsonBeanProcessor() {});
JsonBeanProcessor和实现JsonString很类似,返回一个代表原来目标对象的合法JSONObject

/**
  * @author NowUSeeMe
  */
  @Test
  public void  JsonConfig(){
   Card card1 = new Card();
   card1.setId(1);
   card1.setCardName("中国工商银行");
   card1.setCardNum("123456789");
   card1.setCardHolder("nowu");

   Card card2 = new Card();
   card2.setId(2);
   card2.setCardName("中国农业银行");
   card2.setCardNum("845612345");
   card2.setCardHolder("seeme");


   List<Card> cards = new ArrayList<Card>();
   cards.add(card1);
   cards.add(card2);

   Account complexBean = new Account();
   complexBean.setUserName("accountName");
   complexBean.setAge(20);
   complexBean.setCards(cards);
   complexBean.setCreateTime(new Date());
   JsonConfig jsonConfig = new JsonConfig();
   //注册JsonBeanProcessor
   jsonConfig.registerJsonBeanProcessor(Account.class, new JsonBeanProcessor() {
        @Override
        public JSONObject processBean(Object bean, JsonConfig config) {
            Account account = (AccountCopy)bean;
            return new JSONObject().element("age", account.getAge()).element("userName", account.getUserName());
        }
    });

   JSONObject jsonObject = JSONObject.fromObject(complexBean,jsonConfig); 
   System.out.println(jsonObject);
  }

运行结果:

{"age":20,"userName":"accountName"}

自定义JsonBeanProcessor

上面的结果包含的日期的格式不是我们想要的,我们希望日期格式是”yyyy-mm-dd HH:mm:ss”这种格式,即可自定义一个JsonBeanProcessor在序列化时处理日期。即:

 @Test
  public void  JsonConfig(){
   Card card1 = new Card();
   card1.setId(1);
   card1.setCardName("中国工商银行");
   card1.setCardNum("123456789");
   card1.setCardHolder("nowu");

   Card card2 = new Card();
   card2.setId(2);
   card2.setCardName("中国农业银行");
   card2.setCardNum("845612345");
   card2.setCardHolder("seeme");


   List<Card> cards = new ArrayList<Card>();
   cards.add(card1);
   cards.add(card2);

   Account complexBean = new Account();
   complexBean.setUserName("accountName");
   complexBean.setAge(20);
   complexBean.setCards(cards);
   complexBean.setCreateTime(new Date());
   JsonConfig jsonConfig = new JsonConfig();
   //设置排除属性数组
   String[] excludes ={"cards"};
   jsonConfig.setExcludes(excludes);
   jsonConfig.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {
        //自定义日期格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //处理对象
        @Override
        public Object processArrayValue(Object arg0,JsonConfig config) {
            return null;
        }
        //处理数组
        @Override
        public Object processObjectValue(String propertyName, Object value, JsonConfig config) {
            if(propertyName.equals("createTime")){
                return simpleDateFormat.format(value);
            }
            return value;
        }

   });   
   JSONObject jsonObject = JSONObject.fromObject(complexBean,jsonConfig);  
   System.out.println(jsonObject);
  }

运行结果:

{"age":20,"createTime":"2017-02-18 15:32:42","userName":"accountName"}

Json转换为Bean

json字符串转换为复杂类型Bean

 /**
 * 详述:将json解析成复合类型对象, 包含List
   */
  @Test
  public void Json2ComplexBean(){
   String json = " {" +
         "  'age':20,'cards':[{'cardHolder':'now','cardName':'中国工商银行','cardNum':'123456789','id':1}," +
                 "                    {'cardHolder':'you','cardName':'中国农业银行','cardNum':'845612345','id':2}," +
                 "                    {'cardHolder':'see','cardName':'中国银行','cardNum':'123456789','id':3}," +
                 "                    {'cardHolder':'me','cardName':'中国建设银行','cardNum':'666666666','id':4}" +
                 "                   ]," +
                 "  'createTime':{'date':20,'day':2,'hours':16,'minutes':5,'month':11,'seconds':18," +
                 "                  'time':1482221118856,'timezoneOffset':-480,'year':116}," +
                 "  'userName':'accountName'" +
                 " }";
   JSONObject jsonObject = JSONObject.fromObject(json);
   // 定义一个Map  
   Map<String, Class<Card>> classMap = new HashMap<String, Class<Card>>();  
   classMap.put("cards", Card.class);       
   Account account =  (Account) jsonObject.toBean(jsonObject, Account.class,classMap);
   System.out.println("userName:"+account.getUserName());
   System.out.println("age:"+account.getAge());
   List<Card> cards = account.getCards();
   for(Card card:cards){
       System.out.println("id:"+card.getId()+"   cardName:"+card.getCardName()+"      cardHolder:"+card.getCardHolder()+"    cardNum:"+card.getCardNum());
   }
  }
userName:accountName
age:20
id:1   cardName:中国工商银行      cardHolder:now    cardNum:123456789
id:2   cardName:中国农业银行      cardHolder:you    cardNum:845612345
id:3   cardName:中国银行      cardHolder:see    cardNum:123456789
id:4   cardName:中国建设银行      cardHolder:me    cardNum:666666666

JsonConfig各种处理器总结

DefaultValueProcessor: 为java类型指定默认值,我们一般不需要实现这个接口,json-lib提供的默认实现基本上可以满足我们的需要。
JsonBeanProcessor:为java对象指定一个解析器。
JsonValueProcessor:为bean的值指定一个解析器,可以将bean中的值输出到json后使用另外的值表示,稍后举例说明
PropertyNameProcessor: 为bean的属性名指定一个解析器,可以将bean中属性名称输出到json后变成另一个名称。
一个JsonConfig对象可以注册多个解析器,既可以为按bean的类型注册解析器,也可以给特定类型的某一个属性指定解析器。

参考

http://blog.csdn.net/jinwufeiyang/article/details/51751904
http://www.sojson.com/blog/20.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值