JSON utils 工具类核心方法parseObject , toString实现

发布时间 2023-12-05 20:26:58作者: lartimes
  1 package com.ls.utils;
  2 
  3 import java.lang.reflect.Array;
  4 import java.lang.reflect.Field;
  5 import java.util.Arrays;
  6 
  7 /**
  8 * @author Lartimes
  9 * @version 1.0
 10 * @description: JSON工具类
 11 * toJSONString
 12 * parseObject
 13 * @since 2023/10/24 16:50
 14 */
 15 public class JSON {
 16 private JSON() {
 17 }
 18 
 19 
 20 /**
 21 * toJsonString
 22 * @param obj
 23 * @return
 24 */
 25 public static String toJSONString(Object obj) {
 26 if (ClassUtiils.isPrimitiveTypeOrWrapper(obj.getClass())) {
 27 throw new RuntimeException("the method of toJsonString only support complex Object");
 28 }
 29 StringBuilder builder = new StringBuilder();
 30 Class<?> aClass = obj.getClass();
 31 builder.append("{");
 32 Field[] declaredFields = aClass.getDeclaredFields();
 33 try {
 34 for (Field field : declaredFields) {
 35 field.setAccessible(true);
 36 String key = field.getName();
 37 Object value = field.get(obj);
 38 if (value == null) { //优先级最高
 39 builder.append("\"" + key + "\" : ");
 40 builder.append((String) null);
 41 builder.append(",");
 42 } else if (Number.class.isAssignableFrom(value.getClass())) { //是Number
 43 builder.append("\"" + key + "\" : ");
 44 builder.append(value);
 45 builder.append(",");
 46 } else if (Boolean.class.isAssignableFrom(value.getClass())) { //如果是booleaan
 47 builder.append("\"" + key + "\" : ");
 48 builder.append(value);
 49 builder.append(",");
 50 } else if (String.class.isAssignableFrom(value.getClass())) {
 51 builder.append("\"" + key + "\" : ");
 52 builder.append("\"" + value + "\"");
 53 builder.append(",");
 54 } else if (value.getClass().isArray()) {
 55 if (ClassUtiils.isPrimitiveTypeOrWrapper(value.getClass().componentType())) {
 56 throw new RuntimeException("the " + field.getName() + "should not be primitiveType arrays");
 57 }
 58 builder.append("[");
 59 for (int i = 0; i < Array.getLength(value); i++) {
 60 Object o = Array.get(value, i);
 61 builder.append(toJSONString(o));
 62 }
 63 builder.deleteCharAt(builder.length() - 1);
 64 builder.append("],");
 65 } else if (!ClassUtiils.isPrimitiveTypeOrWrapper(value.getClass())) {
 66 builder.append("\"" + key + "\" : ");
 67 builder.append(toJSONString(value));
 68 builder.append(",");
 69 }
 70 /* * null "key" : null
 71 number 优先级 "key" : number
 72 true /false "key" : true/false
 73 string "key" : "value"
 74 * array "key" : [递归]
 75 * object "key" : {"key..."} 递归
 76 * */
 77 }
 78 } catch (Exception e) {
 79 e.printStackTrace();
 80 }
 81 builder.deleteCharAt(builder.length() - 1);
 82 builder.append("}");
 83 return builder.toString();
 84 }
 85 
 86 public static <T> T parseObject(String jsonStr, Class<T> clazz) {
 87 
 88 if (ClassUtiils.isPrimitiveTypeOrWrapper(clazz)) {
 89 throw new RuntimeException("the method of toJsonString only support complex Object");
 90 }
 91 Field[] fields = clazz.getDeclaredFields();
 92 T t = null;
 93 try {
 94 t = clazz.getDeclaredConstructor().newInstance();
 95 for (Field field : fields) {
 96 field.setAccessible(true);
 97 String name = field.getName();
 98 Class<?> fieldType = field.getType();
 99 /* * null "key" : null 1
100 number 优先级 "key" : number
101 true /false "key" : true/false
102 string "key" : "value" 2
103 * array "key" : [递归] 3
104 * object "key" : {"key..."} 递归 4
105 */
106 if (Number.class.isAssignableFrom(fieldType) || Boolean.class.isAssignableFrom(fieldType)) { //是Number或者Boolean
107 int index = jsonStr.indexOf(name);
108 int begin = jsonStr.indexOf(":", index + 1);
109 int end = jsonStr.indexOf(",", begin);
110 if (end == -1) { //---- 说明是最后一个 找到 } trim即可
111 end = jsonStr.indexOf("}", begin);
112 }
113 String value = jsonStr.substring(begin + 1, end).trim();
114 if (!ClassUtiils.primitiveWrapperTypeMap.containsKey(fieldType)) {//包装类
115 fieldType = ClassUtiils.getPrimitiveType(fieldType);
116 }
117 Object invoked = fieldType.getDeclaredMethod("valueOf", String.class).invoke(null, value);
118 field.set(t, invoked);
119 System.out.println(invoked + "注入成功");
120 } else if (String.class.isAssignableFrom(fieldType)) {
121 System.out.println(name);
122 int index = jsonStr.indexOf(name);
123 int begin = getStringIndex(jsonStr, index + 1);
124 int end = jsonStr.indexOf("\"", begin);
125 String value = jsonStr.substring(begin, end);
126 field.set(t, value);
127 System.out.println("注入成功" + value);
128 System.out.println("str");
129 } else if (fieldType.isArray()) {
130 // 获取内部基本属性 , 如果是complex Object 继续否则,error
131 Class<?> componentType = fieldType.componentType();
132 if (ClassUtiils.isPrimitiveTypeOrWrapper(componentType)) {
133 throw new RuntimeException("the " + field.getName() + "should not be primitiveType arrays");
134 }
135 int index = jsonStr.indexOf(name);
136 int begin = jsonStr.indexOf("[", index + 1);
137 int end = getEndIndex(jsonStr.substring(begin));
138 String value = jsonStr.substring(begin, end);
139 Object[] objects = new Object[getArrayLength(value)];
140 for (int i = 0; i < objects.length; i++) {
141 objects[i] = parseObject(getComponentStr(value, i + 1), componentType);
142 }
143 field.set(t, objects);
144 System.out.println("注入成功" + Arrays.toString(objects));
145 } else if (!ClassUtiils.isPrimitiveTypeOrWrapper(fieldType)) {
146 // 如果是obj
147 int index = jsonStr.indexOf(name);
148 int begin = jsonStr.indexOf("{", index + 1);
149 
150 String value = getObjectEnd(jsonStr.substring(begin));
151 System.out.println(value);
152 field.set(t, parseObject(value, fieldType));
153 System.out.println("诸如成功" + value);
154 }
155 }
156 } catch (Exception e) {
157 e.printStackTrace();
158 }
159 System.out.println(t);
160 return t;
161 }
162 
163 
164 private static String getComponentStr(String value, int sequence) {
165 String retStr = null;
166 int begin = 0;
167 int end = 0;
168 for (int i = 0; i < sequence; i++) {
169 begin = value.indexOf("{");
170 end = value.indexOf("}", begin);
171 int countL = 0;
172 int countR = 1;
173 for (int j = begin; j < end; j++) {
174 if (value.charAt(j) == '{') {
175 countL++;
176 }
177 }
178 while (countR != countL) {
179 end = value.indexOf("}", end);
180 countR++;
181 }
182 retStr = value.substring(begin, end + 1);
183 value = value.substring(end + 1);
184 }
185 return retStr;
186 }
187 
188 private static int getEndIndex(String substring) {
189 int countA = 0;
190 int countB = 0;
191 for (int i = 0; i < substring.length(); i++) {
192 if (substring.charAt(i) == '[') {
193 countA++;
194 } else if (substring.charAt(i) == ']') {
195 countB++;
196 }
197 if (countB == countA) {
198 return countB + 1;
199 }
200 }
201 throw new RuntimeException("the format of this jsonStr is illegal ");
202 }
203 
204 /**
205 * String类型获取其value “value” 第一个字母的值
206 *
207 * @param str
208 * @return
209 */
210 
211 private static int getStringIndex(String str, int beginIndex) {
212 int index = str.indexOf("\"", str.indexOf("\"", beginIndex) + 1) + 1;
213 return index;
214 }
215 
216 
217 /**
218 * @param str
219 * @return
220 */
221 private static int getArrayLength(String str) {
222 // { {{}}}, { {{}}} ,{ {{}}} 从中找长度
223 int count = 0;
224 int begin = 0;
225 while ((begin = str.indexOf("{")) != -1) {
226 int end = str.indexOf("}");
227 while (!countArray(str.substring(begin, end + 1))) {
228 end = str.indexOf("}", end + 1);
229 }
230 count++;
231 str = str.substring(end + 1);
232 }
233 return count;
234 }
235 
236 private static boolean countArray(String pointCut) {
237 int countL = 0;
238 int countR = 0;
239 for (int i = 0; i < pointCut.length(); i++) {
240 if (pointCut.charAt(i) == '{') {
241 countL++;
242 } else if (pointCut.charAt(i) == '}') {
243 countR++;
244 }
245 }
246 return countL == countR;
247 }
248 
249 private static String getObjectEnd(String str) {
250 System.out.println(str);
251 int countL = 0;
252 int countR = 0;
253 for (int i = 0; i < str.length(); i++) {
254 if (str.charAt(i) == '{') {
255 countL++;
256 } else if (str.charAt(i) == '}') {
257 countR++;
258 }
259 if (countL == countR) {
260 return str.substring(0, i + 1);
261 }
262 }
263 throw new RuntimeException("the format of this jsonStr is illegal ");
264 }
265 }