本文目錄一覽:
- 1、有關restful 怎麼把json對象直接映射成java對象
- 2、jackson中objectMapper的使用
- 3、Java的json反序列化:Java數據類可以和json數據結構不一致嗎?
- 4、proprietes類型配置和json類型如何對應
有關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-hant/n/140172.html