java複雜json報文(解析複雜的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-tw/n/256829.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:42
下一篇 2024-12-15 12:42

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中將字元串轉化為浮點數

    本文將介紹在Python中將字元串轉化為浮點數的常用方法。在介紹方法之前,我們先來思考一下這個問題應該如何解決。 一、eval函數 在Python中,最簡單、最常用的將字元串轉化為…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論