json型字符串取值

json型字符串取值

1
2
3
4
5
public String getMsg(String msg){
JSONObject object = JSON.parseObject(msg);
String resultMsg = object.getString("data");
return resultMsg;
}

Gson

​ 都8012年了我还用这么原始的方法嘛,如果遇到了bean怎么办,有更好的工具:Gson和Jackson,这里只讲Gson。Gson提供了fromJson()toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化

Serialization:序列化,使Java对象到Json字符串的过程。

Deserialization:反序列化,字符串转换成Java对象。

1
2
3
4
5
//最简单的用法
//toJson:将对象转换为json字符串
String jsonstr = new Gson().toJson(user, User.class);
//fromJson:将就送字符串转化为对象
User user = new Gson().fromJson(jsonstr, User.class);

​ 但序列化和反序列化的过程中,期望的驼峰格式会被转成实际的下划线格式,解决这个问题可以用@SerializedName注解,在实体类定义属性的时候加:

1
2
@SerializedName("email_address")
public String emailAddress;

​ 如果接收的格式不止两种,还可加alternate参数,可以看做是给属性加多个“别称”

1
2
@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
public String emailAddress;

​ 除了Object,基本数据类型的json生成与解析也是可以的,只是意义不大。另外还可对List、Map、Set等,一一来研究:

温馨提示:如若需要频繁操作,直接创一个gson对象,以免不必要的资源浪费,但我比较懒,所以下面写的都是new Gson().balabala,后面我会总结一个工具类,这里就当个demo看看

List转化

1
2
3
4
5
6
7
8
9
//这是一个带泛型的list,我们想把它转为json
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);

String str = new Gson().toJson(list);
//转回泛型list有点复杂,要用TypeToken
List<User> resultlist = new Gson().fromJson(str,new TypeToken<List<User>>() {}.getType());

Map转化

1
2
3
4
5
6
7
8
//这是一个普通的Map,我们把key定义为string,value定义为一个Object
Map<String, Object> map = new HashMap<>();
map.put("a",user1);
map.put("b",user2);
//把map转为json
String str = new Gson().toJson(map);
//换回map也要用TypeToken
Map<String, Object> resultmap = new Gson().fromJson(str,new TypeToken<Map<String,Object>>() {}.getType());

Set转化

1
2
3
4
5
6
7
8
//这是一个简单的Set,里面存的是String
Set<String> set = new HashSet<>();
set.add("bala");
set.add("balala");
//把set转为json
String str = new Gson().toJson(set);
//换回set
Set<String> resultset = new Gson().fromJson(str,new TypeToken<Set<String>>() {}.getType());

GsonUtil

吼啦,贴一个自己用的GsonUtil,只写了一个转化list的,因为我只用到了这个,以后用到了再加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Type;
import java.util.List;

/**
* @program: UnifiedBgManage
* @description: Gson-处理json字符串
* @author: WYuyin
* @create: 2018-12-13 11:19
**/
public class GsonUtil {
private static Logger logger = LoggerFactory.getLogger(GsonUtil.class);
private static Gson gson = new Gson();

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

public static String toJson(Object o , Type type) {
return gson.toJson(o,type);
}

public static <T> T toObject(String jsonstr , Type type) {
return gson.fromJson(jsonstr,type);
}
/**
* @Description: 由于比较懒,直接把jsonstr里的值获取出来
* 例:"{\"data\":[],\"desc\":\"1000\",\"pageNum\":1,\"status\":\"success\",\"total\":0}"
* -> "[]"
* @Param: [jsonstr, title] title:key 比如"data","status"...
* @return: java.lang.String
* @Author: WYuyin
*/
public static String getData(String jsonstr , String title) {

JsonObject jsonObject = gson.fromJson(jsonstr,JsonObject.class);
String resultstr = "" + jsonObject.get(title);
return resultstr;
}

/**
* @Description: 将数组字符串转化为list
* @Param: [liststr]
* @return: java.util.List<T>
* @Author: WYuyin
*/
public static <T> List<T> toList(String liststr) {

List<T> resultlist = gson.fromJson(liststr, new TypeToken<List<T>>() {}.getType());
return resultlist;
}
}

##Jackson

大概一个月前整理了一个Gson的用法,但只会Gson怎么够呢,我得看得懂其他人的代码呀,嘿,事实上现在的我就是这样,不同的人给我他们的代码,让我加东西的时候我总要模仿他们的写法,比如有些人不爱写长注释,有些人用Gson而有些人用Jackson…

为了把json数据映射到对象上,你需要:有一个包含你需要的属性值的实体类,类的属性名称与json中的key一一对应,若遇到大小写混乱或下划线的用@JsonProperty(“xxx”)标在属性上

接下来,你可以包装一个jackson的工具类,主要用Jackson ObjectMapper对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class JacksonJsonUtil {

// Jackson ObjectMapper对象
private static final ObjectMapper objectMapper = new ObjectMapper();

static {
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}

public static String object2String(Object object) throws JsonProcessingException {
return objectMapper.writeValueAsString(object);
}

public static <T> T string2Object(String jsonString, Class<T> classType) throws IOException {
return objectMapper.readValue(jsonString, classType);
}

public static <T> List<T> string2List(String jsonString, Class<T> valueClassType) throws IOException {
return objectMapper.readValue(jsonString, objectMapper.getTypeFactory().constructParametricType(ArrayList.class, valueClassType));
}

}