Json字符串转换为java对象的各种实现方法【json_lib框架、Gson、org.json】

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mengzhengbin520.blog.51cto.com/7590564/1283361 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mengzhengbin520.blog.51cto.com/7590564/1283361

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

   欲实现JSON字符串和java对象之间的互相转换,方法有很多!本人层也因为项目上的需求,一度对这几种方法做过研究和试验!现将自己的一点小经验分享与大家,如有纰漏,请指正!

   1.通过json_lib来实现对json和java对象之间的转换,使用JSON-LIB可以极大的简化JAVA对象转换成JSON对象所需进行的操作,更可以避免人工操作生成JSON对象字符串时带来的麻烦和误操作:

   注:欲使用json_lib需要以下几个jar包的支持:

json-lib-1.1-jdk15.jar  下载地址:http://json-lib.sourceforge.net

       commons-collections-3.2.1.jar

       commons-lang-2.4.jar

       commons-logging-1.1.1.jar

       commons-beanutils-1.8.0.jar

       以上commons系列包在tomcat/comon/lib下可以找到;

       ezmorph-1.0.6.jar    下载地址http://ezmorph.sourceforge.net

       morph-1.0.1 下载地址:http://morph.sourceforge.net

   有了这些jar包的支持,平时关于json处理的方法都可以找到对应的类;贴上一段代码示例:


package util;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Set;

import net.sf.json.JSONArray;

import net.sf.json.JSONObject;

public class JSONHelper {

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

     /**

      * 将JSONArray对象转换成Map-List集合

      * @param jsonArr

      * @return

      */

     public static Object JsonToList(JSONArray jsonArr){

         List<Object> jsonObjList = new ArrayList<Object> ();

         for(Object obj : jsonArr){

             if(obj instanceof JSONArray){

                 jsonObjList.add(JsonToList((JSONArray) obj));

             } else if(obj instanceof JSONObject){

                 jsonObjList.add(JsonToMap((JSONObject) obj));

             }else{

                 jsonObjList.add(obj);

             }

         }

         return jsonObjList;

     }

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

    /**

     *  将JSONObjec对象转换成Map-List集合

     * @param json

     * @return

     */

     public static Map<String, Object> JsonToMap(JSONObject json){

         Map<String,Object> columnValMap = new HashMap<String,Object>();

         Set<Object> jsonKeys = json.keySet();

         for (Object key : jsonKeys) {

             Object JsonValObj = json.get(key);

             if(JsonValObj instanceof JSONArray){

                columnValMap.put((String)key,  JsonToList((JSONArray) JsonValObj));

             }else if(key instanceof JSONObject){

                columnValMap.put((String)key,  JsonToMap((JSONObject) JsonValObj));

             }else{

                 columnValMap.put((String)key,JsonValObj);

             }

        }

         return columnValMap;

     }

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

     /**

      * 将json对象转换为map集合,通过此方法获取存放map集合键的list集合

      * @param obj

      * @return

      */

     public static List<Object> mapKeys(Object obj){

         List<Object> keysList = new ArrayList<Object>();

         Map<String,Object> columnValMap = new HashMap<String,Object>();

         String columnStr = "column";

         if(obj instanceof JSONArray){

             List<Map<String, Object>> jsonObjList = new ArrayList<Map<String, Object>> ();

             jsonObjList = (List<Map<String, Object>>) JsonToList((JSONArray) obj);

             columnValMap =(Map<String, Object>) (jsonObjList.get(0));

             //以上三句可优化为如下一句

             //columnValMap =(Map<String, Object>)(((List<Object>)JsonToList((JSONArray) obj)).get(0));

         }else if(obj instanceof JSONObject){

             columnValMap =JsonToMap((JSONObject) obj);

         }else{

             keysList.add(obj);

         }

         for(int i=0;i<columnValMap.keySet().size();i++){

             keysList.add(columnStr+(i+1));

         }

         System.out.println(keysList.size());

         return keysList;

     }

}

     2.通过使用谷歌的Gson来处理json字符串,谷歌的Gson针对封装的javaBean处理起来很方便,但对于未封装的json字符串需要找到技巧处理起来也才能顺手。

      使用谷歌的Gson当然也需要jar包的支持,这需要一个jar包:Gson.jar

      下载地址:http://code.google.com/p/google-gson/downloads/detail?name=google-gson-2.2.4-release.zip

       示例:将通过js获取的json字符串转换为Map、List集合,代码如下:


package util;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import com.google.gson.Gson;

public class JSONHelper {

    private Gson gson = new Gson();

                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    /**

      * 将json对象转换为map集合,通过此方法获取存放map集合键的list集合

      * @param obj

      * @return

      */

    public static List<Object> mapKeys(Map<?,?> map){

         List<Object> keysList = new ArrayList<Object>();

         String columnStr="column";

         for(int i=0;i<map.keySet().size();i++){

             keysList.add(columnStr+(i+1));

         }

         System.out.println(keysList.size());

         return keysList;

    }

                                                                                                                                                                                                                                                                                                                                                                                                                                                 

                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    /**

     * 将传入的json字符串转换为元素为map集合的List集合

     * @param jsonArrStr

     * @return

     */

    public static List<Map<String, Object>> jsonObjList(String jsonArrStr) {

        List<Map<String, Object>> jsonObjList = new ArrayList<Map<String, Object>>();

        List<?> jsonList = Test.jsonToList(jsonArrStr);

        Gson gson = new Gson();

        for (Object object : jsonList) {

            String jsonStr = gson.toJson(object);

            Map<?, ?> json = Test.jsonToMap(jsonStr);

            jsonObjList.add((Map<String, Object>) json);

        }

        return jsonObjList;

    }

                                                                                                                                                                                                                                                                                                                                                                                                                                                 

                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    /**

     * 将传入的json字符串解析为List集合

     * @param jsonStr

     * @return

     */

    public static List<?> jsonToList(String jsonStr) {

        List<?> ObjectList = null;

        Gson gson = new Gson();

        java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<?>>() {}.getType();

        ObjectList = gson.fromJson(jsonStr, type);

        return ObjectList;

    }

                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    /**

     * 将传入的json字符串解析为Map集合

     * @param jsonStr

     * @return

     */

    public static Map<?, ?> jsonToMap(String jsonStr) {

        Map<?, ?> ObjectMap = null;

        Gson gson = new Gson();

        java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<Map<?,?>>() {}.getType();

        ObjectMap = gson.fromJson(jsonStr, type);

        return ObjectMap;

    }

}

    3.使用最轻量级的org.json.jar实现json字符串和java对象之间的互转

       所需jar包:org.json.jar

       下载地址:www.json.org  或第三方:http://kiccp.sinaapp.com/store/info/111

       同样实现对json字符串转换为Map、List集合,代码如下:


package util;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

/**

 * 此类是处理json字符串的工具类

 *

 * @author xiaomeng

 * @since 2013-08-27

 *

 */

public class JSONHelper {

    /**

     * 将json字符串转换为List集合

     *

     * @param jsonArrStr

     * @return

     */

    public static List<Map<String, Object>> jsonObjList(String jsonArrStr) {

        List<Map<String, Object>> jsonList = new ArrayList<Map<String, Object>>();

        JSONArray jsonArr = null;

        try {

            jsonArr = new JSONArray(jsonArrStr);

            jsonList = (List<Map<String, Object>>)JSONHelper.jsonToList(jsonArr);

        } catch (JSONException e) {

            System.out.println("Json字符串转换异常!");

            e.printStackTrace();

        }

        return jsonList;

    }

    /**

     * 将json对象的键值存放在集合,映射table的column

     *

     * @param map

     * @return

     */

    public static List<String> jsonMapKeysList(Map<?, ?> map) {

        List<String> jsonjsonList = new ArrayList<String>();

        String columnStr = "column";

        for (int i = 0; i < map.keySet().size(); i++) {

            jsonjsonList.add(columnStr + (i + 1));

        }

        System.out.println(jsonjsonList.size());

        return jsonjsonList;

    }

    /**

     * 将传递近来的json数组转换为List集合

     *

     * @param jsonArr

     * @return

     * @throws JSONException

     */

    private static List<?> jsonToList(JSONArray jsonArr)

            throws JSONException {

        List<Object> jsonToMapList = new ArrayList<Object>();

        for (int i = 0; i < jsonArr.length(); i++) {

            Object object = jsonArr.get(i);

            if (object instanceof JSONArray) {

                jsonToMapList.add(JSONHelper.jsonToList((JSONArray) object));

            } else if (object instanceof JSONObject) {

                jsonToMapList.add(JSONHelper.jsonToMap((JSONObject) object));

            } else {

                jsonToMapList.add(object);

            }

        }

        return jsonToMapList;

    }

    /**

     * 将传递近来的json对象转换为Map集合

     *

     * @param jsonObj

     * @return

     * @throws JSONException

     */

    @SuppressWarnings("unchecked")

    private static Map<String, Object> jsonToMap(JSONObject jsonObj)

            throws JSONException {

        Map<String, Object> jsonMap = new HashMap<String, Object>();

        Iterator<String> jsonKeys = jsonObj.keys();

        while (jsonKeys.hasNext()) {

            String jsonKey = jsonKeys.next();

            Object jsonValObj = jsonObj.get(jsonKey);

            if (jsonValObj instanceof JSONArray) {

                jsonMap.put(jsonKey, JSONHelper.jsonToList((JSONArray) jsonValObj));

            } else if (jsonValObj instanceof JSONObject) {

                jsonMap.put(jsonKey, JSONHelper.jsonToMap((JSONObject) jsonValObj));

            } else {

                jsonMap.put(jsonKey, jsonValObj);

            }

        }

        return jsonMap;

    }

}

以上三种常用的json和java对象之间的互相转换方法各有其特点,根据我的小经验,现将其优缺点总如下,供参考!

    1.json_lib json解析框架

       优点:各种复杂json格式和对json处理的一般需求都可以做到

       缺点:所需支持的jar文件较多,并且关于jar包版本或许会出现一些杂七杂八的问题

    2.谷歌Gson对json的解析:

       优点:(1)。可以谷歌的Gson就是为处理java对象和json之间转换开发的框架,其可以很简单、方便的对封装的java对象和json格式文本之间的转换,包括java工具类集合之间的转换也很方便;(2)。相对json_lib框架来说,只需要一个Gson.jar就可以,需要jar文件数量少;

       缺点:由于其相对来说偏向于处理java对象和json之间的转换,所以其只简单的处理json字符串和集合类之间的转换稍微需要一个过渡,就是使用反射确定转换的java对象类型。

     3.org.json框架

       优点:在这三者之中,其实最轻量级、同谷歌Gson一样所需jar文件也是最少的一种方法,并且其在处理json字符串到java集合的转黄相对简便

缺点:相对Gson处理java对象和json之间的转换比较费事

综述:这三种解析json的方法各有优缺点,具体可根据自己需求选择使用。

本文出自 “有梦就有希望” 博客,请务必保留此出处http://mengzhengbin520.blog.51cto.com/7590564/1283361

附件下载:
  json-lib-2.4-jdk15框架jar包及其附属jar包
  google-gson最新版本jar包
  org.json.jar包

目录
相关文章
|
19天前
|
Java 开发者
Java 中的 toString() 方法详解:为什么它如此重要?
在Java开发中,`toString()`方法至关重要,用于返回对象的字符串表示。默认实现仅输出类名和哈希码,信息有限且不直观。通过重写`toString()`,可展示对象字段值,提升调试效率与代码可读性。借助Lombok的`@Data`注解,能自动生成标准化的`toString()`方法,简化开发流程,尤其适合字段较多的场景。合理运用`toString()`,可显著提高开发效率与代码质量。
53 0
|
19天前
|
存储 Java 开发者
Java 中的 equals 方法:看似简单,实则深藏玄机
本文深入探讨了Java中`equals`方法的设计与实现。默认情况下,`equals`仅比较对象引用是否相同。以`String`类为例,其重写了`equals`方法,通过引用判断、类型检查、长度对比及字符逐一比对,确保内容相等的逻辑。文章还强调了`equals`方法需遵循的五大原则(自反性、对称性等),以及与`hashCode`的关系,避免集合操作中的潜在问题。最后,对比了`instanceof`和`getClass()`在类型判断中的优劣,并总结了正确重写`equals`方法的重要性,帮助开发者提升代码质量。
53 1
|
1月前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
57 25
|
1月前
|
存储 缓存 安全
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
79 17
|
1月前
|
存储 缓存 安全
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
56 13
|
19天前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
28 0
|
1月前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
62 1
|
2月前
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
Java容器及其常用方法汇总
|
1月前
|
运维 Java 程序员
Java中的异常处理方法
本文深入剖析Java异常处理机制,介绍可检查异常、运行时异常和错误的区别与处理方式。通过最佳实践方法,如使用合适的异常类型、声明精确异常、try-with-resources语句块、记录异常信息等,帮助开发者提高代码的可靠性、可读性和可维护性。良好的异常处理能保证程序稳定运行,避免资源泄漏和潜在问题。
|
1月前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
91 5
下一篇
oss创建bucket