java基础之Json

相互转换

字符串 ⇋ 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
WriteEnumUsingToStringEnum输出name()或者original,默认为false
WriteEnumUsingName
UseISO8601DateFormatDate使用ISO8601格式输出,默认为false
WriteNullListAsEmptyList字段如果为null,输出为[],而非null
WriteNullStringAsEmpty字符类型字段如果为null,输出为”“,而非null
WriteNullNumberAsZero数值字段如果为null,输出为0,而非null
WriteNullBooleanAsFalseBoolean字段如果为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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值