本文目錄一覽:
- 1、Java的json反序列化:Java數據類可以和json數據結構不一致嗎?
- 2、json數組轉java對象怎麼轉
- 3、json格式的字符串轉換為java對象
- 4、json字符串怎麼轉換為java對象
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反射機制進行。
以上代碼運行結果:
json數組轉java對象怎麼轉
有兩種方法實現:
(1)直接轉換:
創建JSONArray對象、JSONObject對象,通過put方法將其數據以鍵值對的形式填充,如例:
//假如有一個Java實體類Person,包括以下屬性:phone、sex、married、address。
ArrayListPerson persons = new ArrayListPerson();
for (int i = 0; i 3; i++) {
persons.add(new Person(“138******67”, “女”, true, “北京朝陽區”));//填充Java實體類集合
}
JSONArray array = new JSONArray();// Json格式的數組形式
JSONObject obj;//json格式的單個對象形式
for (int i = 0; i persons.size(); i++) {
obj = new JSONObject();
//依次填充每一個Java實體對象
try {
obj.put(“phone”, persons.get(i).getPhone());//json通過put方式以key-value形式填充
obj.put(“sex”, persons.get(i).getSex());
obj.put(“married”, persons.get(i).getMarried());
obj.put(“address”, persons.get(i).getAddress());
array.put(obj);//將JSONObject添加入JSONArray
} catch (JSONException e) {
e.printStackTrace();
}
}
(2)通過GSON工具實現:
只需要創建GSON對象,通過toJson方法轉換即可。如例:
//模擬Java數據
Person person = new Person(“敏敏”, 23, “女”, “北京市海淀區”);
//創建GSON對象
Gson gson = new Gson();
//調用toJson方法即可轉換為字符串的json格式
String json = gson.toJson(person);
json格式的字符串轉換為java對象
先來解釋反斜杠幹嘛用的:
你既然提到了是json字符串,對,請注意字符串三個字。什麼是字符串?兩個引號之間的就是一個字符串比如:”abcdefg”這就是字符串.
假如我有個json對象:
{
“message” : “success”
}
那麼問題來了,怎麼把它放到一個String字符串對象里呢?
那麼我們都會這麼做:
String json = “{“message”:”success”}”;
對吧?但是這麼做對嗎?前面說過了,字符串是引號開始,引號結尾的,再看一眼這麼做對嗎?
所以我們需要轉義字符去將引號放入字符串當中,而不是字符串定義的功能。“ \” ”就是表示將雙引號放入字符串中。
2. json字符串轉java對象
下面以ali的fastjson為例,講解json字符串轉json對象:
String jsonStr = “{\”message\” : \”success\”}”;
JSONObject jsonObject = JSON.parseObject(jsonStr);
String message = jsonObject.getString(“message”);
System.out.println(message);
假如你有想要轉換成的bean :
public class Info {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
就可以這樣:
String jsonStr = “{\”message\” : \”success\”}”;
Info info = JSON.parseObject(jsonStr, Info.class);
System.out.println(info.getMessage());
這裡的fastjson只是處理json的框架中的一個,此外還有jackson、Gson等等,可以根據自己的需求選擇一個就可以了。
json字符串怎麼轉換為java對象
您好,鑒於此問題,我將提供您如下的解決方案:
1、首先,加入如下 jar 文件到工程中:
2、編寫 java 代碼,進行json 數據的轉換
3、控制台輸出結果如下所示:
{“age”:90,”houses”:[],”id”:1,”name”:”liNing”}
User [age=90, houses=[], id=1, name=liiNing]
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/150558.html