首页 > 其他分享 >JSON utils 工具类核心方法parseObject , toString实现

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

时间:2023-12-05 20:35:45浏览次数:32  
标签:end String int builder value parseObject JSON utils append

  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 }

 

标签:end,String,int,builder,value,parseObject,JSON,utils,append
From: https://www.cnblogs.com/lartimes/p/17878096.html

相关文章

  • vue中引用utils中的方法
    utils中的目录解构如下(utils在src目录下),以深拷贝为例:deepClone文件的代码如下:functiondeepClone(substance){if(typeofsubstance!=='object'||substance==null){returnsubstance;}constresult=Array.isArray(substance)?[]:{};for(constkey......
  • c++ json的解析和QT中json的操作
    1.下载jsoncpp源码2.首先建议jsoncpp源码编译成动态库https://www.bilibili.com/video/BV1pb4y1W7ZZhttps://www.bilibili.com/video/BV1Ra4y1e7gL (1)用QT的Cmake工具 (2)用Visualstudio a.工具打开jsoncpp源码,在CMakeLists.txt右键->jsoncpp的CMak......
  • 【虹科干货】关于JSON数据库,你了解多少?
    如何理解JSON数据库?作为NoSQL数据库的一种类型,JSON数据库有哪些优势呢?JSON数据库如何运作,它为应用程序开发者带来了哪些价值呢?文章速览:什么是JSON什么是JSON数据库JSON数据库的显著优势关于JSON数据库的Q&A 一、什么是JSON?首先,我们得明确“JSON”的含义。开发人员在创......
  • 实例讲解Python 解析JSON实现主机管理
    本文分享自华为云社区《Python解析JSON实现主机管理》,作者:LyShark。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示数据。JSON是一种独立于编程语言的数据格式,因此在不同的编程语言中都有对应的解析器和生成器。JSON格式的设计......
  • XLSX.utils 下的 Api
    工作表aoa_to_sheet将JS数据数组转换为工作表json_to_sheet将JS对象数组转换为工作表table_to_sheet将DOM表元素转换为工作表sheet_add_aoa将JS数据数组添加到现有工作表中sheet_add_json将JS对象数组添加到现有工作表中sheet_add_dom将DOM表元素中的数......
  • Python 解析JSON实现主机管理
    JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示数据。JSON是一种独立于编程语言的数据格式,因此在不同的编程语言中都有对应的解析器和生成器。JSON格式的设计目标是易于理解、支持复杂数据结构和具有良好的可扩展性。JSON数据是......
  • daemon.json完整配置
    2023-12-04ubuntu安装好docker后,Docker配置文件默认在/etc/docker/daemon.json修改配置文件/etc/docker/daemon.json,进入/etc/docker目录。查看是否有daemon.json文件,没有则执行如下命令创建。touchdaemon.json刚开始文件是空的,添加文件内容配置如下:{"registry-mirrors......
  • SpringBoot+MybatisPlus 存json读json
    基础环境springboot2.5.3mysql8.0.22fastjson22.0.38主要配置1.返回VO字段添加注解@ApiModelProperty("字段内容")@TableField(typeHandler=JacksonTypeHandler.class)privateList<JSONObject>columnContent;2.返回Mapper中的resultMap中字段添加......
  • apache集合工具类ListUtils
    <dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency>判断两集合是否相等List<String>list1=Arrays.asList("1&qu......
  • JSON
    JSON.stringify和JSON.parseJSON.stringify():作用:用于将JavaScript对象或值转换为JSON字符串语法:JSON.stringify(value[,replacer[,space]])value:要转换为JSON字符串的值replacer(可选):用于控制转换过程的函数或数组space(可选):控制结果字......