java在当前传输过程中,json作为目前最广泛被接受的传输方式了,在小伙伴们编程的过程中肯定会遇到,我在最初的时候也是活遇到这个问题。为了获取到json字符串里面的对象信息,绞尽脑汁对字符串最处理。可是老是状态百出。
现在搜集了,些许对json处理的方法,就算是新手的小伙伴们,也能无障碍使用。
一、下面是对于json和对象之间的转换的工具类:
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 对象和json数据转换类
* @author Keen
*
*/
public class PojoMapper {
private static ObjectMapper m = new ObjectMapper();
private static JsonFactory jf = new JsonFactory();
/**
* 将json字符串转换成对象
* @param jsonAsString json字符串
* @param pojoClass 对象的泛型
* @return 返回对象
* @throws JsonMappingException
* @throws JsonParseException
* @throws IOException
*/ public static <T> Object fromJson(String jsonAsString, Class<T> pojoClass)
throws JsonMappingException, JsonParseException, IOException {
return m.readValue(jsonAsString, pojoClass);
}
/**
* 将对象转换为json字符串
* @param pojo 带转换的对象
* @param prettyPrint true/false 一般情况下选择false(注:这里是Boolean类型哦)
* @param
* true的打印效果如下:
* {
"id" : null,
.......
}
false的打印效果如下:
* {"id" : null,.......}
*
* @return 返回json字符串
* @throws JsonMappingException
* @throws JsonGenerationException
* @throws IOException
*/
public static String toJson(Object pojo, boolean prettyPrint)
throws JsonMappingException, JsonGenerationException, IOException {
StringWriter sw = new StringWriter();
JsonGenerator jg = jf.createJsonGenerator(sw);
if (prettyPrint) {
jg.useDefaultPrettyPrinter();
}
m.writeValue(jg, pojo);
return sw.toString();
}
}
通过上面的工具类,我们能够把对象和json字符串做很方便的转换,但是在实际开发过程中,json的字符串可能包含多个对象的数据信息,下面针对比较复杂的json字符串和对象之间做处理。
倘若是下面的字符串,我们需要对其做业务上面的解析,拿出我们需要的信息,并且做出判断:
[{success:"true",infor:[
{"id":"10002","userNumber":"Keen",......
,"dept":{"id":10,"deptName":"市场部",......
}},{......},{......}
上面的json字符串,在我们如果有三层信息:
1,success:true:表示该次操作是否成功,只有这里为true才会有数据;
2,infor里面是返回数据对象的信息;
3,user对象信息里面也包含有dept对象的信息(在转换成json的时候如何转换)
二、解析json字符串,取出对象信息;
/**
* 通过api返回的json字符串,获取对象的list
* @param json api服务器返回的json数据字符串
* @param clazz 对象的全限定名(用于规定list的对象泛型)
* @return 返回装有对象的list
*/
public static <T> List<T> getObject(String json, Class<T> clazz) {
List<T> list = new ArrayList<T>();
try {// 先判断是否获取数据成功
JSONObject object = new JSONObject(json);
if (json==null||"".equals(json)) {
return null;
}
boolean booleans = object.getBoolean("success");
if (booleans) {//判断是否数据成功,成功就转换数据
JSONArray jsonArray = object.getJSONArray("infomation");
List<Object> beanList;
beanList = m.readValue(jsonArray.toString(),new TypeReference<List<Object>>() {});
list = jsonToList(beanList.toArray(), clazz);
} else {
System.out.println("获取数据失败,返回空集合");
return list;
}
} catch (Exception e) {
System.out.println("对象数据获取错误");
e.printStackTrace();
}
return list;
}
三、对象在转换成json数据的时候,如果只是单一的对象,ok下面的可以不用再看,但是如果涉及到上述复杂的情形,可以使用map做拼装;
[{success:"true",infor:[
{"id":"10002","userNumber":"Keen",......
,"dept":{"id":10,"deptName":"市场部",......
}},{......},{......}
还是以这个json字符串为例:
拼接json的数据字符串:
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();
JSONObject jo = new JSONObject();
JSONArray ja = new JSONArray();//----------------------------准备好对象-------------------------------
user.......
//-----------------------------准备好装对象的map------------------------------
map.......
jo.accumulate("success", true);
ja.add(dateUtil.util(map));
jo.accumulate("infor", ja);
out.print(jo.toString());
out.flush();
out.close();
............................
//------------------------------------------------------------------------------------------
其中用到了的工具类:
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.Entity;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
@Entity
public class dateUtil
{
public static JSONObject util(Object object)
{
JsonConfig cfg = new JsonConfig();
cfg.registerJsonValueProcessor(Date.class,
new JsonValueProcessor() {
private final String format = "yyyy-MM-dd";
public Object processObjectValue(String key, Object value, JsonConfig arg2)
{
if (value == null)
return "";
if (value instanceof Date) {
String str = new SimpleDateFormat("yyyy-MM-dd")
.format((Date)value);
return str;
}
return value.toString();
}
public Object processArrayValue(Object value, JsonConfig arg1)
{
return null;
}
});
JSONObject json = JSONObject.fromObject(object, cfg);
return json;
}
}
经过一些处理了一些后,json字符串就拼接好了。