javajson映射,Java映射

本文目錄一覽:

有關restful 怎麼把json對象直接映射成java對象

利用一些jar包對json解析即可。這裡推薦兩個:

1、fastjson,阿里巴巴開源的json解析包。

使用方便,速度較快,下面的代碼可以很快的解析JSON得到Java對象:

 JSONObject jo = JSONObject.parseObject(json);

2、jackson,國外開源的json解析包,也很流行。

其最大的特點是支持流模式的JSON數據解析,這樣在解析較大的json數據時很有優勢。

JsonToken result = null;

int i = 1;

while ((result = p.nextToken()) != null) {

    System.out.println(“[” + i++ + “]” + result); // 根據result類型進行處理

}

jackson中objectMapper的使用

Jackson可以輕鬆的將Java對象轉換成json對象和xml文檔,同樣也可以將json、xml轉換成Java對象

ObjectMapper類是Jackson庫的主要類。它稱為ObjectMapper的原因是因為它將JSON映射到Java對象(反序列化),或將Java對象映射到JSON(序列化)。它使用JsonParser和JsonGenerator的實例實現JSON實際的讀/寫。

三種方式

1.Jackson通過將JSON欄位的名稱與Java對象中的getter和setter方法相匹配,將JSON對象的欄位映射到Java對象中的欄位。Jackson刪除了getter和setter方法名稱的「get」和「set」部分,並將剩餘名稱的第一個字元轉換為小寫。

2.Jackson還可以通過java反射進行匹配

3.通過註解或者其它方式進行自定義的序列化和反序列化程序。

2.Read Object From JSON Reader

3.Read Object From JSON File

本例使用的是文件URL,也可使用一個HTTP URL(如: ).

6.Read Object From JSON Byte Array

7.Read Object Array From JSON Array String

ObjectMapper write有三個方法

使用Jackson可以讀取和寫入除JSON之外的其他數據格式:

其中這些數據格式比JSON更緊湊,因此在存儲時佔用的空間更少,並且讀取和寫入速度比JSON更快。在以下部分中,我將向您展示如何使用Jackson讀取和寫入其中一些數據格式。

CBOR是一種二進位數據格式,它與JSON兼容,但比JSON更緊湊,因此讀寫速度更快。Jackson ObjectMapper可以像讀寫JSON一樣讀寫CBOR。為了使用Jackson讀取和寫入CBOR,您需要為項目添加額外的Maven依賴項。介紹了添加Jackson CBOR Maven依賴關係:

MessagePack是一種文本數據格式,與JSON兼容,但更緊湊,因此讀寫速度更快。Jackson ObjectMapper可以像讀寫JSON一樣讀寫MessagePack。為了使用Jackson讀寫MessagePack,您需要為項目添加額外的Maven依賴項:

YAML是一種文本數據格式,類似於JSON,但使用不同的語法。Jackson ObjectMapper可以像讀寫JSON一樣讀寫YAML。為了使用Jackson讀取和寫入YAML,您需要為項目添加額外的Maven依賴項:

ObjectMapper 可以通過自定義解析器來定義解析方法

以下是自定義的反序列化的方法

註冊到objectMapper中

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反射機制進行。

以上代碼運行結果:

proprietes類型配置和json類型如何對應

在開始使用Java編碼和解碼JSON,將需要安裝JSON模塊可供選擇。在本教程中我下載並安裝JSON.simple簡單JSON-1.1.1.jar文件的位置,並添加到環境變數CLASSPATH:

JSON和Java實體之間的映射

JSON.simple實體映射從左側向右側解碼或解析,並映射實體從右側到左側編碼。

JSON

Java

string

java.lang.String

number

java.lang.Number

true|false

ava.lang.Boolean

null

null

array

java.util.List

object

java.util.Map

雖然解碼,默認 java.util.List的具體類是具體類 org.json.simple.JSONArray 和默認 java.util.Map 是org.json.simple.JSONObject。

在Java的JSON編碼

下面是一個簡單的例子來編碼JSONObject使用Java的JSON對象的一個子類的java.util.HashMap 無序。如果您需要嚴格的順序元素使用方法JSONValue.toJSONString(映射)有序映射實現作為 java.util.LinkedHashMap等。

importorg.json.simple.JSONObject;classJsonEncodeDemo{publicstaticvoidmain(String[]args){JSONObjectobj=newJSONObject();obj.put(“name”,”foo”);obj.put(“num”,newInteger(100));obj.put(“balance”,newDouble(1000.21));obj.put(“is_vip”,newBoolean(true));System.out.print(obj);}}

雖然上述程序的編譯和執行,這將產生以下結果:

{“balance”: 1000.21, “num”:100, “is_vip”:true, “name”:”foo”}

以下是另一個例子,它顯示了使用Java的JSONObject 的 JSON對象流:

importorg.json.simple.JSONObject;classJsonEncodeDemo{publicstaticvoidmain(String[]args){JSONObjectobj=newJSONObject();obj.put(“name”,”foo”);obj.put(“num”,newInteger(100));obj.put(“balance”,newDouble(1000.21));obj.put(“is_vip”,newBoolean(true));StringWriterout=newStringWriter();obj.writeJSONString(out);StringjsonText=out.toString();System.out.print(jsonText);}}

雖然上述程序的編譯和執行,這將產生以下結果:

{“balance”: 1000.21, “num”:100, “is_vip”:true, “name”:”foo”}

在Java的JSON解碼

下面的例子利用的JSONObject 和JSONArray JSONObject 是一個java.util.Map JSONArray是一個java.util.List,所以可以對其進行訪問 Map 和List 的標準操作。

importorg.json.simple.JSONObject;importorg.json.simple.JSONArray;importorg.json.simple.parser.ParseException;importorg.json.simple.parser.JSONParser;classJsonDecodeDemo{publicstaticvoidmain(String[]args){JSONParserparser=newJSONParser();Strings=”[0,{\”1\”:{\”2\”:{\”3\”:{\”4\”:[5,{\”6\”:7}]}}}}]”;try{Objectobj=parser.parse(s);JSONArrayarray=(JSONArray)obj;System.out.println(“The 2nd element of array”);System.out.println(array.get(1));System.out.println();JSONObjectobj2=(JSONObject)array.get(1);System.out.println(“Field \”1\””);System.out.println(obj2.get(“1″));s=”{}”;obj=parser.parse(s);System.out.println(obj);s=”[5,]”;obj=parser.parse(s);System.out.println(obj);s=”[5,,2]”;obj=parser.parse(s);System.out.println(obj);}catch(ParseExceptionpe){System.out.println(“position: “+pe.getPosition());System.out.println(pe);}}}

雖然上述程序的編譯和執行,這將產生以下結果:

The 2nd element of array

{“1”:{“2”:{“3”:{“4”:[5,{“6”:7}]}}}}

Field “1”

{“2”:{“3”:{“4”:[5,{“6”:7}]}}}

{}

[5]

原創文章,作者:ECRL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/140172.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ECRL的頭像ECRL
上一篇 2024-10-04 00:23
下一篇 2024-10-04 00:23

相關推薦

  • 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
  • Java Milvus SearchParam withoutFields用法介紹

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

    編程 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
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論