本文目錄一覽:
- 1、用java怎麼解析複雜的JSON
- 2、Java的json反序列化:Java數據類可以和json數據結構不一致嗎?
- 3、怎樣利用java生成json複雜對象
- 4、怎麼用java對象表示複雜的json
- 5、java組裝複雜的json用什麼包怎麼用
用java怎麼解析複雜的JSON
json-lib-2.4-jdk15.jar 這個包還另需一下幾個包。
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6
把上邊的json定義為一個字符串 str,建議不要直接用還是自己動手寫寫。這樣比較容易掌握方法。
JSONObject ob=JSONObject.fromObject(str);
Object success=ob.get(“success”);
Object errorMsg=ob.get(“errorMsg”);
System.out.println(success);
System.out.println(errorMsg);
JSONObject data=ob.getJSONObject(“data”);
Object total=data.get(“total”);
System.out.println(total);
JSONArray array=data.getJSONArray(“rows”);
JSONObject rows=null;
for(int i=0;iarray.size();i++){
rows=array.getJSONObject(i);
Object id=rows.get(“id”);
System.out.println(id);
Object workName=rows.get(“workName”);
System.out.println(workName);
Object assigneeName=rows.get(“assigneeName”);
System.out.println(assigneeName);
Object name=rows.get(“name”);
System.out.println(name);
Object processInstanceInitiatorName=rows.get(“processInstanceInitiatorName”);
System.out.println(processInstanceInitiatorName);
Object processInstanceStartTime=rows.get(“processInstanceStartTime”);
System.out.println(processInstanceStartTime);
Object createTime=rows.get(“createTime”);
System.out.println(createTime);
Object dueDate=rows.get(“dueDate”);
System.out.println(dueDate);
}
Java的json反序列化:Java數據類可以和json數據結構不一致嗎?
由於時間關係我也沒有寫全,這裡提供一個思路吧。代碼如下:
Account.java:
@Data
public class Account {
private int id;
private String name;
// @PowerfulAnnotation註解是我臆想的
@PowerfulAnnotation(“token.id”)
private String tokenId;
@PowerfulAnnotation(“token.key”)
private String key;
}
PowerfulAnnotation.java:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PowerfulAnnotation {
String value() default “”;
}
測試類Main.java:
public class Main {
public static void main(String[] args) throws Exception {
Account account = new Account();
String ori = “{\n” +
“\”id\”: 11111,\n” +
“\”name\”: \”小李\”,\n” +
“\”token\”: {\n” +
“\”id\”: 22222222,\n” +
“\”key\”: \”ddddddddd\”\n” +
“}\n” +
“}”;
Gson gson = new Gson();
//字符串json轉JsonObject
JsonObject jsonObject = gson.fromJson(ori, JsonObject.class);
//反射獲取目標對象屬性
for (Field field : account.getClass().getDeclaredFields()) {
String fieldName = field.getName();
Class fieldClass = field.getType();
System.out.print(“當前field名:[” + fieldName + “],”);
System.out.println(“當前field類型:[” + fieldClass + “]”);
Annotation annotation = field.getDeclaredAnnotation(PowerfulAnnotation.class);
//檢查是否有PowerfulAnnotation註解
if (annotation != null) {
PowerfulAnnotation powerful = (PowerfulAnnotation) annotation;
String powerfulValue = powerful.value();
System.out.println(“發現PowerfulAnnotation註解,值為:[” + powerfulValue + “]”);
String[] tmp = powerfulValue.split(“\\.”);
//聲明一個臨時JsonObject,將用於獲取下一層json對象
JsonObject tmpJson = jsonObject;
for (int i = 0; i tmp.length; i++) {
//目標值是在powerfulValue的最後一個字段,例如powerfulValue為token.id的話,目標的值就是id,所以先獲取token這個jsonObject,並賦值給臨時tmpJson
if (i != tmp.length – 1) {
tmpJson = jsonObject.get(tmp[i]).getAsJsonObject();
} else {
//到達powerfulValue的最後一個字段,檢查其類型,並賦值給目標對象
Object value = checkFieldType(tmpJson, tmp[i], fieldClass);
//從目標對象中獲取目標屬性
Field targetField = account.getClass().getDeclaredField(field.getName());
targetField.setAccessible(true);//解除私有限制
System.out.println(“將[” + powerfulValue + “]的值[” + value + “]賦給目標對象的[” + fieldName + “]”);
//將值賦值給目標屬性
targetField.set(account, value);
}
}
}
//屬性上沒有PowerfulAnnotation註解
else {
//檢查當前屬性的類型
Object value = checkFieldType(jsonObject, fieldName, fieldClass);
//從目標對象中獲取目標屬性
Field targetField = account.getClass().getDeclaredField(field.getName());
targetField.setAccessible(true);//解除私有限制
System.out.println(“直接將值[” + value + “]賦給目標對象的[” + fieldName + “]”);
//將值賦值給目標屬性
targetField.set(account, value);
}
System.out.println(“*********************************************\n”);
}
System.out.println(“目標對象最終值:” + account);
}
/**
* 檢查當前屬性的類型
* (這裡由於時間關係,我沒有寫全,只檢查了String、int、boolean類型,全類型應包括boolean、char、byte、short、int、long、float、double,你有時間自己補充一下)
*
* 如果發現當前屬性是一個對象,那麼應該將JsonObject轉換成對應的對象再返回(由於時間關係,這裡我也沒有試過,總之思路是這樣)
*/
private static Object checkFieldType(JsonObject field, String fieldName, Class fieldClass) {
if (fieldClass == String.class) {
return field.get(fieldName).getAsString();
}
if (fieldClass == int.class) {
return field.get(fieldName).getAsInt();
}
if (fieldClass == boolean.class) {
return field.get(fieldName).getAsBoolean();
}
return new Gson().fromJson(field.get(fieldName), fieldClass);
}
}
代碼還沒寫完,主要集中在沒有對JsonArray進行處理,當json串里包含數組時會報錯,另外一些沒寫完的我在注釋里寫了點,你可以參照一下。整體思路還是利用java反射機制進行。
以上代碼運行結果:
怎樣利用java生成json複雜對象
1利用:json-lib-2.2.3-jdk13.jar
2使用方法舉例:
JSONObject.fromObject(bean).toString() –返回{“aa”: “xx”,”bb”:”xxx”} (bean為java對象,有aa和bb兩個字段,值分別為xx 和 xxx)
JSONObject.fromObject(map).toString() — 返回{“aa”: “xx”,”bb”:”xxx”} (map)為
HashMap對象,裡面有aa和bb兩個key,value分別為xx 和xxx
JSONArray.fromObject(list).toString() — 返回[{“aa”: “xx”, “bb”:”xxx”}, {“cc”:”xxxx”, “dd”:”xxxxx”}] (list為ArrayList對象,裡面有兩個HashMap對象)
3. 其他使用方法請百度
怎麼用java對象表示複雜的json
按照json的結構來定義bean,即bean裡面的屬性是另外一個bean這麼寫,然後一層一層的轉吧。不然只能使用Map套Map來做了。
java組裝複雜的json用什麼包怎麼用
XSTREAM 可以直接把對象轉成json字符串。
具體用法百度很多的。
當然也可以用json-lib 用法如下 user是一個對象
User user=new User();
user.setId(“123”);
user.setName(“JSONServlet”);
user.setPassword(“JSON”);
user.setSay(“Hello , i am a servlet !”);
JSONObject json=new JSONObject();
json.accumulate(“success”, true);
json.accumulate(“user”, user);
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/256829.html