相互转换
字符串 ⇋ JSONObject
// Json字符串 转 JSONObject
String st = "{name:Tim,age:25,sex:male}";
JSONObject rowData = JSONObject.parseObject(st);
// JSONObject 转 Json字符串
JSONObJect json = new JSONObJect();
String str = json.toString();
JSONObject ⇋ 实体类
//实体类 转 JSONObject
JSONObject jsonObject = JSON.toJSON(xtDmbm);
JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(xtDmbm));
//JSONObject 转 实体类
XtDmbm xtDmbm = JSONObject.toJavaObject(jsonObject, XtDmbm.class);
VehicleInfo vehicleInfo = JSON.toJavaObject(VehicleJSONObject, VehicleInfo.class);
实体类 ⇋ 字符串
// 实体类 转 json字符串
String jsonStr = JSON.toJSONString(person);
// json字符串 转 实体类
// 方法1
Persion persion2 = JSON.parseObject(str, new TypeReference<Persion>(){});
// 方法2
Persion persion2 = JSON.parseObject(str, Persion.class);
按照一定的格式输出时间字段,fastjson支持两种方式:
1.使用JSON.toJSONStringWithDateFormat方法
JSON.toJSONStringWithDateFormat(sanitationCarWsBody, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteMapNullValue));
2.JSON.toJSONString方法增加SerializerFeature.WriteDateUseDateFormat参数
String s = JSON.toJSONString(pojo, SerializerFeature.WriteDateUseDateFormat);
SerializerFeature属性:
名称 | 含义 |
QuoteFieldNames | 输出key时是否使用双引号,默认为true |
UseSingleQuotes | 使用单引号而不是双引号,默认为false |
WriteMapNullValue | 是否输出值为null的字段,默认为false |
WriteEnumUsingToString | Enum输出name()或者original,默认为false |
WriteEnumUsingName | |
UseISO8601DateFormat | Date使用ISO8601格式输出,默认为false |
WriteNullListAsEmpty | List字段如果为null,输出为[],而非null |
WriteNullStringAsEmpty | 字符类型字段如果为null,输出为”“,而非null |
WriteNullNumberAsZero | 数值字段如果为null,输出为0,而非null |
WriteNullBooleanAsFalse | Boolean字段如果为null,输出为false,而非null |
SkipTransientField | 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true |
SortField | 按字段名称排序后输出。默认为false |
WriteTabAsSpecial | 把\t做转义输出,默认为false |
PrettyFormat | 结果是否格式化,默认为false |
WriteClassName | 序列化时写入类型信息,默认为false。反序列化是需用到 |
DisableCircularReferenceDetect | 消除对同一对象循环引用的问题,默认为false |
WriteSlashAsSpecial | 对斜杠’/’进行转义 |
BrowserCompatible | 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE6,默认为false |
WriteDateUseDateFormat | 全局修改日期格式,默认为false。默认JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; |
DisableCheckSpecialChar | 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false |
NotWriteRootClassName | 含义 |
BeanToArray | 将对象转为array输出 |
字符串 ⇋ JSONArray
// Json字符串 转 JSONArray
String st = "[{name:Tim,age:25,sex:male},{name:Tom,age:28,sex:male},{name:Lily,age:15,sex:female}]";
JSONArray jsonArray = JSONArray.parseArray(st);
// JSONArray 转 Json字符串
String jsonString = jsonArray.toString();
List<T> ⇋ JSONArray
//List 转 JSONArray
JSONArray jsonArray = JSON.toJSON(list);
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(list));
//JSONArray 转 List
List<XtDmbm> list = JSONObject.parseArray(jsonArray.toJSONString(), XtDmbm.class);
JSONArray ⇋ JSONObject
// JSONArray 转 JSONObject
JSONObject rowData = new JSONObject();
for(int i;i<tableData.length();i++){
rowData = tableData.getJSONObject[i];
}
// JSONObject 转 JSONArray
JSONObject rowData = {info:
[
{
name:Tim,
age:25,
sex:male
},{
name:Tom,
age:28,
sex:male
},{
name:Lily,
age:15,
sex:female
}
]
};
JSONArry tableData = rowData.get("info");
判断json字符串是否合法
/**
* 判断是JsonObject
* @param obj
* @return
*/
public static boolean isJsonObject(Object obj){
String content = obj.toString();
try {
JSONObject.parseObject(content);
if (content.startsWith("{")) {
return true;
}else {
return false;
}
} catch (Exception e) {
return false;
}
}
/**
* 判断是JsonArray
* @param obj
* @return
*/
public static boolean isJsonArray(Object obj){
String content = obj.toString();
try {
JSONArray.parseArray(content);
if (content.startsWith("[")) {
return true;
}else {
return false;
}
} catch (Exception e) {
return false;
}
}
解析多层嵌套json
首先将JSON字符串解析成JSONObject对象,然后通过连续调用getJSONObject方法来访问嵌套的对象,最后获取目标数据。
String jsonStr = "{\"outer\":{\"inner\":[{\"key\":\"value\"}]}}";
JSONObject jsonObject = JSON.parseObject(jsonStr);
JSONObject outer = jsonObject.getJSONObject("outer");
JSONArray inner = outer.getJSONArray("inner");