本文目录一览:
- 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]