可以转为map,比如HashMap<String,Object> map;
mapput(“data”,HashMap<String,String>)
java处理json,最经典的做法还是将String字符串转换成对象来处理。
需要借助第三方jar包,常见的第三方json处理jar包有:阿里巴巴的fastjson,谷歌的gson还有诸如jackson之类的。
我习惯用gson:
1、引入gson依赖或去网上下载其jar包:
<dependency>
<groupId>comgooglecodegson</groupId>
<artifactId>gson</artifactId>
<version>231</version>
</dependency>
2、根据json串,定义对象:
首先定义json最外层,我称其为Response,Response中有根节点data:
这里我用了lombok的@Data注解,自动生成getter、setter、toString等方法。
然后定义了根节点对象Data1,里面有Record集合records:
之后就是定义Record的各个字段:
现在我就有了完整的数据结构,使用gson进行转换即可:
接下来拿着response对象进行正常的java逻辑处理就行:
完整代码:
public class TController {
public static void main(String[] args) {
String jsonString = "{\n" +
"\"data\":{\n" +
"\"records\":[\n" +
"{\n" +
"\"couponName\":\"\",\n" +
"\"payTime\":\"2021-11-15 11:11:33\",\n" +
"\"providerEndAddress\":\"\",\n" +
"\"paidMoney\":268,\n" +
"\"weihuUserId\":\"0\",\n" +
"\"productTypeName\":\"公路零担\"\n" +
"},\n" +
"{\n" +
"\"couponName\":\"\",\n" +
"\"payTime\":\"2021-11-15 11:11:33\",\n" +
"\"providerEndAddress\":\"\",\n" +
"\"paidMoney\":268,\n" +
"\"weihuUserId\":\"0\",\n" +
"\"productTypeName\":\"航空运输\"\n" +
"}\n" +
"]\n" +
"}\n" +
"}";
Gson gson = new Gson();
Response response = gsonfromJson(jsonString, Responseclass);
Data1 data = responsegetData();//取出data
List<Record> records = datagetRecords();//取出records
for (int i = 0; i < recordssize(); i++) {
//循环判断records中的数据,ProductTypeName不为“公路零担”则移除
if (!"公路零担"equals(recordsget(i)getProductTypeName())) {
recordsremove(i);
i--;
}
}
datasetRecords(records);//覆盖原有的records
responsesetData(data);//覆盖原有的data
Systemoutprintln(gsontoJson(response, Responseclass));//转成json字符串输出
}
@Data
private class Response {
private Data1 data;
}
@Data
private class Data1 {
private List<Record> records;
}
@Data
private class Record {
private String couponName;
private String payTime;
private String providerEndAddress;
private String paidMoney;
private String weihuUserId;
private String productTypeName;
}
}
运行结果:
综上4种Json技术的比较: 在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,
如果只是功能要求,没有性能要求,可以使用google的Gson,
如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean
21 主要类介绍
Gson类:解析json的最基础的工具类
JsonParser类:解析器来解析JSON到JsonElements的解析树
JsonElement类:一个类代表的JSON元素
JsonObject类:JSON对象类型
JsonArray类:JsonObject数组
TypeToken类:用于创建type,比如泛型List<>
22 maven依赖
23 bean转换json
24 json转换bean
25 json转换复杂的bean,比如List,Set
将json转换成复杂类型的bean,需要使用TypeToken
26 通过json对象直接 *** 作json以及一些json的工具
a) 格式化Json
b) 判断字符串是否是json,通过捕捉的异常来判断是否是json
c) 从json串中获取属性
d) 除去json中的某个属性
e) 向json中添加属性
f) 修改json中的属性
g) 判断json中是否有属性
h) json中日期格式的处理
然后使用gson对象进行json的处理,如果出现日期Date类的对象,就会按照设置的格式进行处理
i) json中对于Html的转义
这种对象默认对Html进行转义,如果不想转义使用下面的方法
31 maven依赖
32 基础转换类
同上
33 bean转换json
将对象转换成格式化的json
将对象转换成非格式化的json
obj设计对象
对于复杂类型的转换,对于重复的引用在转成json串后在json串中出现引用的字符,比如 [0]books[1]
34 json转换bean
35 json转换复杂的bean,比如List,Map
36 通过json对象直接 *** 作json
a) 从json串中获取属性
b) 除去json中的某个属性
c) 向json中添加属性
d) 修改json中的属性
e) 判断json中是否有属性
f) json中日期格式的处理
使用JSONtoJSONStringWithDateFormat,该方法可以使用设置的日期格式对日期进行转换
41 maven依赖
42 基础转换类
同上
43 bean转换json
a)将类转换成Json,obj是普通的对象,不是List,Map的对象
b) 将List,Map转换成Json
44 json转换bean
45 json转换List,对于复杂类型的转换会出现问题
46 json转换Map
47 json对于日期的 *** 作比较复杂,需要使用JsonConfig,比Gson和FastJson要麻烦多了
创建转换的接口实现类,转换成指定格式的日期
48 JsonObject 对于json的 *** 作和处理
a) 从json串中获取属性
b) 除去json中的某个属性
c) 向json中添加和修改属性,有则修改,无则添加
d) 判断json中是否有属性
fastjson 和 jackson 在把对象序列化成json字符串的时候,是通过反射遍历出该类中的所有getter方法;
Gson 是通过反射遍历该类中的所有属性。
所以, 在定义POJO中的布尔类型的变量时,不要使用isSuccess这种形式,而要直接使用success 。
以上为网上摘抄,以下为实际项目中使用结果。
实体类为 BaseVOjava :
用Gson 将该实体类转成json时报以下异常:
原因是:子类和父类有相同的字段属性;
解决方法:
(1)重命名重复字段。因为重复的字段在第三方包中,所以该方法在本例中不可行。
(2)将实体类中需要打印的字段加上注解 @Expose ,(本例将该类所有有get方法的属性都加上了) :
新建gson:
excludeFieldsWithoutExposeAnnotation 排除掉没有Expose注解的属性。
或者在不需要解析的字段前面加上 transient :
用该方式,没有报异常了,解析结果(加注解 @Expose 或加 transient )如下:
但从结果来看,那些直接调用第三方api获取值的属性没有解析,因为第三方的类无法加上 @Expose注解 ,导致这些属性为 null ,而 Gson默认的规则不会解析为 null 的属性 ,比如:
(3)换解析方式:使用FastJson。
因为FastJson是通过getter方法获取属性,并把其值序列化成json字符串的,所以这里,我们这个实体类中去掉不想被解析的属性的get方法,变成如下:
fastJson、JackJson以及Gson序列化对象与get、set以及对象属性之间的关系
去网上找一个gson的jar包,把这个包build进项目
Gson gson2 = new Gson();
String zhangsan="{\"birthday\":\"2016-10-01 15:15:20\",\"userName\":\"张三\"}";
Map fromJson = gson2fromJson(zhangsan, HashMapclass);
Iterator it = fromJsonkeySet()iterator();
while(ithasNext()){
String a = (String)itnext();
Systemoutprintln("转换后的元素拆分为:"+a+"-"+fromJsonget(a));
}
结果:
转换后的元素拆分为:birthday-2016-10-01 15:15:20
转换后的元素拆分为:userName-张三
在上一篇博客中,我们已经向你展示了 GsonBuilder 的基础。 GsonBuilder 可以用于自定义Gson的行为,从而影响序列化和反序列化的方方面面。在这篇博客中,你将学会如何使用强制Gson序列化空值。
还记得之前发布的关于空值映射的博客吗?它通过很多例子向我们展示了,当值为空时Gson是如何行为的。如果你还没有阅读,你或许可以移步到那篇博客获取有价值的信息。如果你很心急,我们直接告诉你要点:当属性的值设为空时将不会被序列化。
忽略空值这一行为对于减少JSON字符串的体积来说通常是个好主意。然而,并不总是如此。有些API会强制要求该域存在或者 null 值对于某一属性来说有特定的含义(换句话说,某值的默认值不是为空;我们需要明确的设置它为空)。
Gson为改变这一默认的行为提供了选择。我们可以使用 GsonBuilder 来为序列化提供 null 值。如果你还不熟悉 GsonBuilder ,请阅读上一篇博客。
我们复用之前博客中的 UserSimple 模型。
现在,我们为其创建一个email为空的用户实例。
默认设置下, email 属性将不会在JSON结果中出现:
如果你要求 email 域作为JSON的一部分,你需要调用 GsonBuilder 的 serializeNulls() 方法。如果你这样做了,Gson将会序列化所有属性,即使属性设置为空:
usersJson现在包括 email 域了:
在这篇博客中你已经学会了如何强制Gson序列化值为空的属性。
在下一篇博客中,我们将向你展示如何自定义选择哪些域可以序列化和反序列化。
以上就是关于初学者求教GSON解析,不创建javabean全部的内容,包括:初学者求教GSON解析,不创建javabean、用Java语言:从下列Json数组中只展示“productTypeName=公路零担”的数据集、Gson、FastJson、Jackson、json-lib对比总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)