JSON框架- jackson

来源:互联网 发布:node 编辑:程序博客网 时间:2024/04/30 10:22

ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中实现。

ObjectMapper有多个JSON序列化的方法,可以把JSON字符串保存File、OutputStream等不同的介质中。

如下:

    • writeValue(File arg0, Object arg1)把arg1转成json序列,并保存到arg0文件中。
    • writeValue(OutputStream arg0, Object arg1)把arg1转成json序列,并保存到arg0输出流中。
    • writeValueAsBytes(Object arg0)把arg0转成json序列,并把结果输出成字节数组。
    • writeValueAsString(Object arg0)把arg0转成json序列,并把结果输出成字符串。

e.g. :

    • bean - - json
@Test    public void testSelect(){        /*set auto commit ,which equals to the above*/        SqlSession session = MybatisUtils.getFactory().openSession(true);        String statement = "com.web.mapper.userMapper.getUser";        /*return the effect rows*/        User user =  session.selectOne(statement, 3);        System.out.println("effect rows.."+user);        ObjectMapper objectMapper = new ObjectMapper();        try {            //writeValue(System.out, user)            objectMapper.writeValue(System.out, user);            /*            String json = objectMapper.writeValueAsString(user);            */        } catch (JsonGenerationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (JsonMappingException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

这里写图片描述

    • ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。

e.g. :

            String json = objectMapper.writeValueAsString(user);            System.out.println("json.."+json);            //Deserialize。。            User user2 = objectMapper.readValue(json, User.class);            System.out.println("user2。。"+user2);
    • the result print as follows–:
effect rows..User [age=13, id=3, name=tom4]json..{"id":3,"name":"tom4","age":13}user2。。User [age=13, id=3, name=tom4]
    • 若对象中有date,需要使用SimpleDateFormat进行格式化
objectMapper.getDeserializationConfig().setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    • json - to-Map<String, Object>
            Map<String, Object> map = objectMapper.readValue(json, Map.class);            for(Entry<String, Object> entry : map.entrySet()){                System.out.println(entry.getKey()+","+entry.getValue());            }
      • the result as follows :
json..{"id":3,"name":"tom4","age":13}//转换为jsonuser2。。User [age=13, id=3, name=tom4]//读出为Userid,3//json to mapname,tom4age,13
    • Map<String,Object> to json
String json2 = objectMapper.writeValueAsString(map);
      • the result as follows :
json..{"id":3,"name":"tom4","age":13}
    • List<User> to json
        List<User> users= session.selectList(statement);        ObjectMapper objectMapper = new ObjectMapper();        String json = objectMapper.writeValueAsString(users);
      • the result as follows
json..[{"id":1,"name":"tom1","age":11},{"id":2,"name":"tom2","age":12},{"id":3,"name":"tom4","age":13},{"id":7,"name":"tom5","age":15},{"id":8,"name":"Tom6","age":16},{"id":9,"name":"Tom6","age":16}]
    • json to List<User>

      Jackson处理一般的JavaBean和Json之间的转换只要使用ObjectMapper 对象的readValue和writeValueAsString两个方法就能实现。但是如果要转换复杂类型Collection如 List<User>,那么就需要先反序列化复杂类型 为泛型的Collection Type。

            JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, User.class);            List<User> userList = objectMapper.readValue(json, javaType);            for (User user:userList) {                System.out.println(user);            }
      • the result as follows :
User [age=11, id=1, name=tom1]User [age=12, id=2, name=tom2]User [age=13, id=3, name=tom4]User [age=15, id=7, name=tom5]User [age=16, id=8, name=Tom6]User [age=16, id=9, name=Tom6]
    • Map<String,User> to JSON
            JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, User.class);            List<User> userList = objectMapper.readValue(json, javaType);            Map<String, User> userMap = new HashMap<String, User>();            for (User user:userList) {//              System.out.println(user);                for (int i = 0; i < userList.size(); i++) {                    userMap.put("user"+i, user);                }            }            String json2 = objectMapper.writeValueAsString(userMap);            System.out.println("json2.."+json2);            /*three parameters map.class,key.class,value.class*/            JavaType javaType2 = objectMapper.getTypeFactory().constructParametricType(Map.class,String.class, User.class);            Map<String, User> userMap2 = objectMapper.readValue(json2, javaType2);            for(Entry<String, User> entry : userMap2.entrySet()){                System.out.println(entry.getKey()+","+entry.getValue());            }
    • List<User>直接转换过来的json,不能直接转换为Map<String,User> !!!
list to json..[{"id":1,"name":"tom1","age":11},{"id":2,"name":"tom2","age":12},{"id":3,"name":"tom4","age":13},{"id":7,"name":"tom5","age":15},{"id":8,"name":"Tom6","age":16},{"id":9,"name":"Tom6","age":16}]

这里写图片描述

      • 更改为json2:
json2..{"user0":{"id":9,"name":"Tom6","age":16},"user2":{"id":9,"name":"Tom6","age":16},"user1":{"id":9,"name":"Tom6","age":16},"user4":{"id":9,"name":"Tom6","age":16},"user3":{"id":9,"name":"Tom6","age":16},"user5":{"id":9,"name":"Tom6","age":16}}
    • 转换之后的Map<User>:
user0,User [age=16, id=9, name=Tom6]user2,User [age=16, id=9, name=Tom6]user1,User [age=16, id=9, name=Tom6]user4,User [age=16, id=9, name=Tom6]user3,User [age=16, id=9, name=Tom6]user5,User [age=16, id=9, name=Tom6]
0 0
原创粉丝点击