GsonUtil.java
4.7 KB
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.xdy.commonlibrary.utils.dataprocess;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializer;
import com.xdy.network.WrapGsonDeserializerInfo;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* @author 蒋洪波
* @file GsonUtil.java
* @brief Gson工具类
* @date 2017-10-10
* Copyright (c) 2017, 学点云
* All rights reserved.
*/
public class GsonUtil {
/**
* @param json
* @param clazz
* @param <T>
* @return
* @brief 将JSON转为实体
*/
public static <T> T json2Bean(String json, Class<T> clazz) {
return json2Bean(json, clazz, null);
}
static IntegerMayBeEmptyStringDeserializer emptyStringDeserializer = new IntegerMayBeEmptyStringDeserializer();
static DoubleMayBeEmptyStringDeserializer doubleEmptyStringDeserializer = new DoubleMayBeEmptyStringDeserializer();
/**
* @param json
* @param clazz
* @param info 反序列化处理封装集合
* @param <T>
* @return
* @brief 带有反序列化器的GSON
*/
public static <T> T json2Bean(String json, Class<T> clazz, List<WrapGsonDeserializerInfo> info) {
GsonBuilder gsonBuilder = new GsonBuilder().serializeNulls();
//默认注册两个
gsonBuilder.registerTypeAdapter(int.class, emptyStringDeserializer);
gsonBuilder.registerTypeAdapter(double.class, doubleEmptyStringDeserializer);
if (info != null && info.size() > 0) {
for (WrapGsonDeserializerInfo wrapGsonDeserializerInfo : info) {
JsonDeserializer deserializer = wrapGsonDeserializerInfo.getDeserializer();
Class cls = wrapGsonDeserializerInfo.getClazz();
gsonBuilder.registerTypeAdapter(cls, deserializer);
}
}
Gson gson = gsonBuilder.create();
try {
T t = gson.fromJson(json, clazz);
return t;
} catch (Exception e) {
e.printStackTrace();
System.out.println("GSON EX ++++++++++++" + e.toString());
return null;
}
}
/**
* @param obj
* @return
* @brief 将一个对象装为Json格式的字符串
*/
public static String bean2json(Object obj) {
Gson gson = new Gson();
return gson.toJson(obj);
}
/**
* @param obj
* @return
* @brief 对JSONOBJECT内部进行排序
*/
public static String sortJSONObject(JSONObject obj) {
try {
if (obj == null)
return null;
Iterator<String> keys = obj.keys();
String[] keySort = new String[obj.length()];
//把KEY取出来
for (int i = 0; i < keySort.length; i++) {
keySort[i] = keys.next();
}
//对Key进行排序
Arrays.sort(keySort);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keySort.length; i++) {
sb.append(keySort[i]);
sb.append("=");
//先取值的类型
Object opt = obj.opt(keySort[i]);
if (opt instanceof Number) {
//对于数字类型的数据要用JSONObject处理数字方式重新处理,否则会与传递给服务器的不一样,因为在put参数的时候会按这样的方式做检查处理,会导致舍弃精度的操作。
String num = JSONObject.numberToString((Number) opt);
sb.append(num);
} else if (opt instanceof JSONArray) {//判断是否是JSONArray
//提供一个方法用于返回JSONArray的值,此处按理来说应该递归sortJSONArray,但是后台为了简单点处理,直接把第二层做字符串拼接起来
String result = sortJSONArray((JSONArray) opt);
sb.append(result);
} else {
sb.append(obj.optString(keySort[i]));
}
}
return sb.toString();
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
public static String sortJSONArray(JSONArray value) {
StringBuilder jsonString = new StringBuilder();
for (int i = 0; i < value.length(); i++) {
String s = sortJSONObject(value.optJSONObject(i));
//如果为空,取字符串
if (TextUtils.isEmpty(s)) {
s = value.optString(i);
}
jsonString.append(s);
}
return jsonString.toString();
}
}