美文网首页
Java-Javascript-Json(3J)之间的转换总结

Java-Javascript-Json(3J)之间的转换总结

作者: 行径行 | 来源:发表于2017-11-19 12:22 被阅读0次

    • tags:java,json,javascript
    • categories:笔记
    • date: 2016-11-16 20:18:52

    在日常的开发中,在前后端的数据传输与处理中,总会遇到java与json的数据转换,javascript内json与string之间的转换等。所以就想总结看看这三个之间是如何转换的,可以有那些方式进行转换呢?这3J的转换也总会与string字符串类型有关,因为字符串在我们程序中简直不能再常见了。o(≧v≦)o。。。所以咧,就打算用具体代码实例来看看它们是如何进行数据处理的,下一次若是有这种类似的需求,就可以很快把代码撸出来了,也是基本功的问题。


    3j.png

    下面就根据目前我的学习知识,总结以下它们各自之间的关系和转换过程。

    Java与Json

    其中最重要也最长使用的就是后台的java与json数据的转换,包括java pojo转成json字符串,再通过response输出到浏览器前端页面进行渲染等其他处理,当然也有,从前端获取json格式字符串,到后台接收数据后,将字符串转换成bean或者集合等等。所以,java与json转化的工具库也是挺多的,主要的包括以下几种:Jackson,Fastjson,Google-Gson,Json-lib。。等等,具体的可以参考该篇文章Java 的 JSON 开源类库选择比较

    下面就说说主要使用的几种工具库把。。在此之前,把几个类库需要用到的基础数据准备好,包括一个user,book两个bean。

    public class User {
    
        private int id;
        private String userName;
        private String password;
        private int age;
        private String phoneNumber;
        private String address;
        private List<Books> lbooks;
    //getter setter
    ...
    }
    
    public class Books {
    
        private String author;
        private String price;
        private String name;
    //getter setter
    ...
    }
    

    构造的简单基础数据,这些数据都是被下面几种库所共用的:

        public User user1;
        public User user2;
        public List<User> lusers = new ArrayList<User>();
        public List<Books> lbooks = new ArrayList<Books>(); 
        public Map<Integer,User> musers = new HashMap<Integer,User>();
        
        @Before
        public void init(){
            initUsers();
            lusers.add(user1);
            lusers.add(user2);
            musers.put(1, user1);
            musers.put(2, user2);
        }
        
        public void initUsers(){
        user1 = new User();
        user1.setId(1);
        user1.setUserName("heiOne");
        user1.setPassword("aa");
        user1.setPhoneNumber("1234");
        user1.setAge(20);
        user1.setAddress("CN.GZ");
        
        user2 = new User();
        user2.setId(2);
        user2.setUserName("heiTwo");
        user2.setPassword("bb");
        user2.setPhoneNumber("56789");
        user2.setAge(30);
        user2.setAddress("CN.SH");
        
        Books b1 = new Books();
        b1.setAuthor("泰戈尔");
        b1.setPrice("50.00");
        b1.setName("飞鸟集");
        Books b2 = new Books();
        b2.setAuthor("司汤达");
        b2.setPrice("40.00");
        b2.setName("红与黑");
        
        Books b3 = new Books();
        b3.setAuthor("塞林格");
        b3.setPrice("30.00");
        b3.setName("麦田里的守望者");
        lbooks.add(b1);
        lbooks.add(b2);
        List<Books> cbooks = new ArrayList<Books>();
        cbooks.addAll(lbooks);
        user1.setLbooks(lbooks);
        cbooks.add(b3);
        user2.setLbooks(cbooks);
        }
    

    其中,User中包含Books的集合属性,为了测试复合结构的数据集合。

    • Jackson:
      Jackjson工具库功能挺强大的,可以读取文件流获取字节码来处理json字符串,也能对树模型操作,提供了api总有关于节点的构建操作。当然了,也能处理与java对象的双向转换。这点其实可以从Jackson的maven库配置的artifactId可以看到,提供对应的不同模块功能的处理。
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.8.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.8.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-base -->
            <dependency>
                <groupId>com.fasterxml.jackson.jaxrs</groupId>
                <artifactId>jackson-jaxrs-base</artifactId>
                <version>2.8.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider -->
            <dependency>
                <groupId>com.fasterxml.jackson.jaxrs</groupId>
                <artifactId>jackson-jaxrs-json-provider</artifactId>
                <version>2.8.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.8.0</version>
            </dependency>
    

    下面通过编写的一个测试用例类JavaAndJsonWithJackson.java来看看具体的操作。对于功能性较强的Jackson,我们只是关注它的java与json之间转换的部分,它的核心类就是ObjectMapper,有兴趣学习更多内容的可以自行度娘。(不过话说连jackson官网都被xx了,汗...)

    总的来说,若是java类型想要转成json格式字符串,就用writeValueAsString等格式方法;若是json字符串要转成java类型对象,则使用readValue方法。
    Java POJO与Json之间的转换:
    对于java数据转成json,大多都是writeValue*相关的方法。这种也是最简单基础的用法啦...

        @Test
        public void javaPojoPointToJsonStr() throws Exception{
         ObjectMapper om = new ObjectMapper();
         //java pojo转换成json字符串
         String ustr = om.writeValueAsString(user1);
         System.out.println("java user pojo 转换成json字符串:"+ ustr);
         
         //json 字符串转成java pojo
         User jsonUser = om.readValue(ustr, User.class);
         System.out.println("user json 字符串转成User.class pojo"+jsonUser);
        }
    
    //输出:可以在www.bejson.com在线格式化校验json字符串
    java user pojo 转换成json字符串:
    {
        "id": 1,
        "userName": "heiOne",
        "password": "aa",
        "age": 20,
        "phoneNumber": "1234",
        "address": "CN.GZ",
        "lbooks": [
            {
                "author": "泰戈尔",
                "price": "50.00",
                "name": "飞鸟集"
            },
            {
                "author": "司汤达",
                "price": "40.00",
                "name": "红与黑"
            }
        ]
    }
    user json 字符串转成User.class pojo:(输出格式是通过toString定义的)
    User.class pojoUser 
    [id=1, userName=heiOne, password=aa, age=20, phoneNumber=1234, address=CN.GZ, 
    lbooks=[Books [author=泰戈尔, price=50.00, name=飞鸟集], 
    Books [author=司汤达, price=40.00, name=红与黑]]]
    

    Java List集合与Json之间的转换:
    其实也都差不多,只是当json字符串转成java list集合时候,每个list内的数据类型是:LinkedHashMap,然后可以通过key,value形式取出每个数据。

        @Test
        public void javaListPointToJsonStr() throws Exception{
            ObjectMapper om = new ObjectMapper();
            
            //java list转换成json字符串
            String listStr = om.writeValueAsString(lusers);
            System.out.println("java list集合转换为json字符串:"+listStr);
            
            //list形式json字符串转换成java list. List<User>不可转
            List uList = om.readValue(listStr, List.class);
            System.out.println("list json 转换成java list集合:"+uList);
            for(int i=0;i<uList.size();i++){
    //          System.out.println(uList.get(i).getClass()); //LinkedHashMap
                LinkedHashMap lhm = (LinkedHashMap) uList.get(i);
                System.out.println(lhm.get("userName"));
                System.out.println(lhm.get("lbooks"));
            }
        }
    
    //输出:
    [
        {
            "id": 1,
            "userName": "heiOne",
            "password": "aa",
            "age": 20,
            "phoneNumber": "1234",
            "address": "CN.GZ",
            "lbooks": [
                {
                    "author": "泰戈尔",
                    "price": "50.00",
                    "name": "飞鸟集"
                },
                {
                    "author": "司汤达",
                    "price": "40.00",
                    "name": "红与黑"
                }
            ]
        },
        {
            "id": 2,
            "userName": "heiTwo",
            "password": "bb",
            "age": 30,
            "phoneNumber": "56789",
            "address": "CN.SH",
            "lbooks": [
                {
                    "author": "泰戈尔",
                    "price": "50.00",
                    "name": "飞鸟集"
                },
                {
                    "author": "司汤达",
                    "price": "40.00",
                    "name": "红与黑"
                },
                {
                    "author": "塞林格",
                    "price": "30.00",
                    "name": "麦田里的守望者"
                }
            ]
        }
    ]
    
    heiOne
    [{author=泰戈尔, price=50.00, name=飞鸟集}, {author=司汤达, price=40.00, name=红与黑}]
    heiTwo
    [{author=泰戈尔, price=50.00, name=飞鸟集}, {author=司汤达, price=40.00, name=红与黑}, 
    {author=塞林格, price=30.00, name=麦田里的守望者}]
    

    Java Map集合与Json之间的转换:
    使用方法和输出都与list集合差不多,就不在多说了。

        @Test
        public void javaMapPointToJsonStr()throws Exception{
            ObjectMapper om = new ObjectMapper();
            //java map ---> json
            String mapStr = om.writeValueAsString(musers);
            System.out.println("java map集合转换为json字符串:"+mapStr);
            
            //map json --> java map
            Map umap = om.readValue(mapStr, Map.class);
            System.out.println("map json 转换为java map:"+umap);
    //      System.out.println(umap.get("1").getClass());
            for(int i=1;i<=umap.size();i++){
                LinkedHashMap lhm = (LinkedHashMap) umap.get(String.valueOf(i));
                System.out.println(lhm.get("userName"));
                System.out.println(lhm.get("lbooks"));
            }
            
        }
    

    • FastJson:
      下面这个就是阿里的fastjson啦,感觉也挺强大和易用的,主要是通过com.alibaba.fastjson.JSON对象进行转换。
      若是java类型转成json格式字符串,可以使用toJSONString方法,反之,可以使用parseObject或者parseArray等方法。想了解更多,可以查看fastjson的github项目

    这里的例子输出可以参考jackson的test测试用例。这里多说一点,fastjson在输出字符串的时候,若是数据相同则会出现$ref引用符号出现,在测试的时候,发现若是将带有这个引用符号的json字符串转换成java类型对象会出现null值的现象。
    maven库配置:

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.13</version>
            </dependency>
    

    Java POJO与Json之间的转换:

        @Test
        public void javaPojoPointToJsonStr() throws Exception{
         //java pojo转换成json字符串
         String ustr = JSON.toJSONString(user1);
         System.out.println("java user pojo 转换成json字符串:"+ ustr);
    //     
         //json 字符串转成java pojo
         User jsonUser = JSON.parseObject(ustr,User.class);
         System.out.println("user json 字符串转成User.class pojo"+jsonUser);
        }
    

    Java List集合与Json之间的转换:

        @Test
        public void javaListPointToJsonStr() throws Exception{
            
    //      java list转换成json字符串
            String listStr = JSON.toJSONString(lusers);
            System.out.println("java list集合转换为json字符串:"+listStr);
            
    //      list形式json字符串转换成java list. JSON.parseObject
            List uList = JSON.parseObject(listStr, List.class);
            System.out.println("list json 转换成java list集合:"+uList);
            for(int i=0;i<uList.size();i++){
    //          System.out.println(uList.get(i).getClass());//JSONObject
                JSONObject jo = (JSONObject) uList.get(i);
    //          System.out.println(jo.size());
                System.out.println(jo.get("userName"));
                System.out.println(jo.get("lbooks"));
            }
            
            //JSON.parseArray
            List<User> uList1 = JSON.parseArray(listStr, User.class);
            System.out.println(uList1);
            for(User u : uList1){
                System.out.println(u.getUserName());
            }
        }
    
    

    Java Map集合与Json之间的转换:

        @Test
        public void javaMapPointToJsonStr()throws Exception{
    //      //java map ---> json
            String mapStr = JSON.toJSONString(musers);
            System.out.println("java map集合转换为json字符串:"+mapStr);
    //      
            //map json --> java map
            //http://blog.csdn.net/weixiaodedao/article/details/51790790  解决使用fastJson中出现$ref问题
            JSONObject umap = JSON.parseObject(mapStr); //引用$ref,null
            System.out.println("map json 转换为java map:"+umap);
    //      System.out.println(umap.get("1").getClass());
            for(int i=1;i<=umap.size();i++){
                JSONObject obj = (JSONObject) umap.get(String.valueOf(i)); //com.alibaba.fastjson.JSONObject
                System.out.println(obj.get("userName"));
                
            }
            
        }
    

    • JSON-lib:
      若是要转换成json格式字符串可以使用JSONObject.fromObject或者JSONArray.fromObject方法;若是要转换成集合或者java bean则可以使用这些方法JSONArray.toList(已废弃)或者JSONArray.toArray,至于map的转换,可以要自己来抽取内部数据实现调整了。

    maven库配置:

            <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
            <dependency>    
                 <groupId>net.sf.json-lib</groupId>    
                 <artifactId>json-lib</artifactId>    
                <version>2.4</version>    
                <classifier>jdk15</classifier>    
            </dependency>  
    

    Java POJO与Json之间的转换:

        //http://ryxxlong.iteye.com/blog/583862  json-lib使用方法
        @Test
        public void javaPojoPointToJsonStr() throws Exception{
         //java pojo转换成json字符串,都是先转换成JSONObject对象
         JSONObject jsonObject = JSONObject.fromObject(user1);
         String ustr = jsonObject.toString();
         System.out.println("java user pojo 转换成json字符串:"+ ustr);
         
    //     json 字符串转成java pojo
         User jsonUser = (User) JSONObject.toBean(jsonObject, User.class);
         System.out.println("user json 字符串转成User.class pojo"+jsonUser);
        }
    

    Java List集合与Json之间的转换:

        @Test
        public void javaListAndArrayPointToJsonStr() throws Exception{
            
    //      java list转换成json字符串
            JSONArray jsonArray = JSONArray.fromObject(lusers);
            String listStr = jsonArray.toString();
            System.out.println("java list集合转换为json字符串:"+listStr);
            
    //      list形式json字符串转换成java list. 
    //      List<User> uList = JSONArray.toList(jsonArray, User.class); //toList已被废弃
            User[] array = (User[]) JSONArray.toArray(jsonArray, User.class);
    //      System.out.println("list"+uList);
            System.out.println("array:"+array);
            
            //JSON.parseArray
    //      for(User u : uList){
    //          System.out.println(u.getUserName());
    //      }
            for(int i=0;i<array.length;i++){
                System.out.println(array[i].getUserName());
            }
        }
    

    Java Map集合与Json之间的转换:
    若是想看看更细节的map与json转换,可以参考这篇文章:<u>采用json-lib进行Map与Json转换</u>

        @Test
        public void javaMapPointToJsonStr()throws Exception{
    //      //java map ---> json 这里map<key,value>中必须为string类型
            Map<String,String> tmp = new HashMap<String,String>();
            tmp.put("one", "apple");
            tmp.put("two", "hehe");
            JSONObject ja= JSONObject.fromObject(tmp);
            System.out.println("java map集合转换为json字符串:"+ja.toString());//{"two":"hehe","one":"apple"}
            
            Map<String,Map<String,String>> mmtmp = new HashMap<String,Map<String,String>>();
            Map<String,String> mtmp = new HashMap<String,String>();
            mtmp.put("inner", "test");
            mmtmp.put("a", mtmp);
            mmtmp.put("b", mtmp);
            JSONArray jsonArray= JSONArray.fromObject(mmtmp);
            System.out.println("java map集合转换为json字符串:"+jsonArray.toString());//[{"b":{"inner":"test"},"a":{"inner":"test"}}]
    //      
            //更多使用JSON-LIB 对map与json转换可以参考该片文章:https://my.oschina.net/heweipo/blog/386808       
        }
    

    关于java与json数据的基本转换常用工具使用方法就写到这,当然这些都是基础内容,在项目开发中,实则可以自己在封装工具类对需求的业务进行处理。

    Json与Javascript

    除了java与json之间需要转换,经常在开发web项目时候,从后端得到的json字符串在前端处理总会要转换成json对象的需求,反之亦然。所以,来看看在前端页面中的script脚本中是如何处理json数据的?

    其实,javascript原生的就有对json数据转换的方法。总的来说,在前端页面的script脚本中:json字符串想转换成json对象,可以使用
    eval('(' + jsonstr + ')')方法;json对象要转换成string字符串则可以使用JSON.stringify(jsonObject)方法。

    下面看看后端输出json字符串到前端后,前端如何处理json字符串的:

    • 后端java代码:使用jackson来将list集合转换成json字符串输出:
        public List<User> lusers = new ArrayList<User>();
    
        @RequestMapping(value="/jj.do",method=RequestMethod.GET)
        public String toJJPage(HttpServletRequest request) throws Exception{
            if(lusers.size()<1)
            initData();
            ObjectMapper om = new ObjectMapper();
            
            //java list转换成json字符串
            String listStr = om.writeValueAsString(lusers);
            System.out.println("java list集合转换为json字符串:"+listStr);
            request.setAttribute("lusers", listStr);
            return "js_json";
        }
    
    • 在看使用springmvc将页面跳转到js_json.jsp中:
      可以看到,将后端中的request域中的lusers属性输出是一串json格式字符串,然后在script脚本中使用方法eval('('+str+')'),JSON.stringify方法将json字符串和json对象互相转换。
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    Object listUser = request.getAttribute("lusers");
    %>
    <!DOCTYPE html>
    <html>
      <head>
        <base href="<%=basePath%>">
        <title>Javascript-json</title>
      </head>
       
      <body>
        List user: <%=listUser%>
        <script type="text/javascript">
         var luser = '<%=listUser%>'; 
         alert(luser+':'+typeof(luser));    //string
         //JSON字符串转换为JSON对象
         var json = eval('(' + luser + ')'); //可用
         var json = JSON.parse(luser);
         alert(json+':'+typeof(json));
         alert(json[0].userName);
         //将json对象转换为json格式字符串
         var userJson = JSON.stringify(json);   //ok
         alert('json object --> json string:'+userJson);
        </script>
      </body>
    </html>
    
    

    Java与Javascript

    咳咳...这个就是最简单了。通常需要将java对象转换成javascript对象时候,一般就是在前端页面中,例如jsp等。在<% %>中可以定义或者java代码对象,可以通过<%=variable %>表达式可以获取java对象。结合这些特性,那么要在script脚本中使用java对象,只需要用两个'单引号将java对象引起来即可赋值给javascript变量。

    可以参照上面json与javascript转换中的jsp页面中就有使用:

     <script type="text/javascript">
         var luser = '<%=listUser%>';  //将java对象赋值给javascript变量
         alert(luser+':'+typeof(luser));    //string
        </script>
    

    ok,总结得差不多了,日后有可以完善的在整合啦...( ̄▽ ̄)~*

    参考:
    Java 的 JSON 开源类库选择比较
    JS操作JSON总结

    相关文章

      网友评论

          本文标题:Java-Javascript-Json(3J)之间的转换总结

          本文链接:https://www.haomeiwen.com/subject/yybuvxtx.html