教你怎么编写高效的JSON工具类

Posted 格姗知识圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教你怎么编写高效的JSON工具类相关的知识,希望对你有一定的参考价值。

链接:

https://blog.csdn.net/lkp_kapila/article/details/78153848


在开发过程中,极有可能会用到JSON数据的传输。这不,笔者在前段时间的开发过程中在http请求后台数据时就用到了JSON与对象和集合之间的转换。在JSON数据组装的过程中,你还在怕一个个字符串拼接出错而烦恼吗?在这里笔者整理了一个完整的工具类,能够帮助大家快速而高效的开发,妈妈再也不用担心我在这一块出错了。


package com.beichende.ibank.util;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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.JSONObject;

/**
* Description:GSON单例类,提供对象到JSON数据格式转换
*
* @author gujc
*/

public class JsonUtil {
   private static Gson gson = null;

   private JsonUtil() {
   }

   private static Gson gson() {
       if (gson == null) {
           synchronized (JsonUtil.class) {
               if (gson == null) {
                   gson = new Gson();
               }
           }
       }
       return gson;
   }

   /**
    * 目标对象到JSON数据格式转换
    *
    * @param src 目标对象
    */

   public static String toJson(Object src) {
       return gson().toJson(src);
   }

   /**
    * JSON格式数据到目标对象转换
    *
    * @param js    JSON格式数据
    * @param clazz 目标对象類型
    * @return 目标对象
    * @throws "JsonConvertException"
    */

   public static <T> T fromJson(String js, Class<T> clazz) {
       return gson().fromJson(js, clazz);
   }

   public static <T> List<T> getObjectList(String jsonString,Class<T> cls){
       List<T> list = new ArrayList<T>();
       try {
           Gson gson = new Gson();
           JsonArray arry = new JsonParser().parse(jsonString).getAsJsonArray();
           for (JsonElement jsonElement : arry) {
               list.add(gson.fromJson(jsonElement, cls));
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
       return list;
   }
   public static <M> List<M> getList(String jsonString,Class<M> cls){
       List<M> list = new ArrayList<M>();
       try {
           Gson gson = new Gson();
           JsonArray arry = new JsonParser().parse(jsonString).getAsJsonArray();
           for (JsonElement jsonElement : arry) {
               list.add(gson.fromJson(jsonElement, cls));
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
       return list;
   }
   /**
    * Json 转成 Map<>
    * @param jsonStr
    * @return
    */

   public static Map<String, Object> getMapForJson(String jsonStr){
       JSONObject jsonObject ;
       try {
           jsonObject = new JSONObject(jsonStr);

           Iterator<String> keyIter= jsonObject.keys();
           String key;
           Object value ;
           Map<String, Object> valueMap = new HashMap<String, Object>();
           while (keyIter.hasNext()) {
               key = keyIter.next();
               value = jsonObject.get(key);
               valueMap.put(key, value);
           }
           return valueMap;
       } catch (Exception e) {
           // TODO: handle exception
           e.printStackTrace();
       }
       return null;
   }
   /**
    * Json 转成 List<Map<>>
    * @param jsonStr
    * @return
    */

   public static List<Map<String, Object>> getlistForJson(String jsonStr){
       List<Map<String, Object>> list = null;
       try {
           JSONArray jsonArray = new JSONArray(jsonStr);
           JSONObject jsonObj ;
           list = new ArrayList<Map<String,Object>>();
           for(int i = 0 ; i < jsonArray.length() ; i ++){
               jsonObj = (JSONObject)jsonArray.get(i);
               list.add(getMapForJson(jsonObj.toString()));
           }
       } catch (Exception e) {
           // TODO: handle exception
           e.printStackTrace();
       }
       return list;
   }
   public static <T> boolean isEmpty(List<T> sourceList) {
       return (sourceList == null || sourceList.size() == 0);
   }
   /**
    * 输入流转字符串
    * @param is
    * @return
    */

   public  static String convertStreamToString(InputStream is) {

       BufferedReader reader = new BufferedReader(new InputStreamReader(is));
       StringBuilder sb = new StringBuilder();
       String line = null;
       try {
           while ((line = reader.readLine()) != null) {
               sb.append(line);
           }
       } catch (IOException e) {
           e.printStackTrace();
       } finally {
           try {
               is.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       return sb.toString();

   }
}


这是一个JSON工具类,里面用到的一个工具包就是Gson,这个包里面集成了很多对JSON数据的操作方法,可以让我们很轻松的完成对这一块数据的转换操作。目前阿里巴巴也提供了一个fastjson的包,同样能很方便实现JSON数据转换的的操作,这里就不去过多阐述,有兴趣的可以在网上了解了解。首先我们可以先去网上下载好Gson包,然后复制进项目的lib文件夹下面。加进项目后就可以使用这么一个工具类了。下面就来简单介绍下这个工具类的用法吧!

1.将String数据转换成JSON格式的数据,调用这个方法时我们只要传入一个键值对类型的字符串就能自动转换成你想要的JSON格式的数据,这是不是比你一个一个去组装更方便啊!

2.将JSON格式的数据转换成实体对象,有时在进行前后台数据传输时,我们需要对对象进行操作,这里我们就需要将JSON格式的数据转换成对象。

3.list集合和JSON数组的互转。这里我举一个例子,大家一看便知。

首先创建一个包含list集合属性的实体类和一个list集合属性类型的实体类。

public class Student {
 private String name;
 private String sex;
 private String age;
 private String address;
 
 public Student() {
   
 }
 
 public Student(String name, String sex, String age, String address) {
   super();
   this.name = name;
   this.sex = sex;
   this.age = age;
   this.address = address;
 }
 public String getName() {
   return name;
 }
 public void setName(String name) {
   this.name = name;
 }
 public String getSex() {
   return sex;
 }
 public void setSex(String sex) {
   this.sex = sex;
 }
 public String getAge() {
   return age;
 }
 public void setAge(String age) {
   this.age = age;
 }
 public String getAddress() {
   return address;
 }
 public void setAddress(String address) {
   this.address = address;
 }
 
}


public class StudentCount {
 private String count;
 private List<Student> list;
 public String getCount() {
   return count;
 }
 public void setCount(String count) {
   this.count = count;
 }
 public List<Student> getList() {
   return list;
 }
 public void setList(List<Student> list) {
   this.list = list;
 }
 
}


StudentCount类中包含list集合,list集合中的成员为student对象。像这种类型的数据,我们可以通过调用工具类将JSON数组转换成StudengCount对象,转换起来很方便,可以大大减少开发中部必要的麻烦。工具类中还有很多的方法,这里只讲解了常用的三种,有兴趣可以多研究研究。大家可以在实际开发中直接使用到,希望能帮到大家!


往期精彩内容





以上是关于教你怎么编写高效的JSON工具类的主要内容,如果未能解决你的问题,请参考以下文章

Json解析工具类

浅笑若风教你高效圆满完成工作任务

最简单简洁高效的Json数据解析

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

手把手教你使用nodejs编写cli(命令行)——拉取远程仓库作为代码模板

用python编写一个高效搜索代码工具