java如何返回json格式?

Python014

java如何返回json格式?,第1张

处理基本的java对象使用JSONObject类,用法大体如下:

public void testMap(){

Map<String,Object>map = new HashMap<String,Object>()

map.put("name", "qiu")

map.put("password", "123")

map.put("address", "china")

User user = new User()

user.setUserName("qiuqiu")

user.setPassword("123456")

user.getTels().add("1234444556677")

user.getTels().add("6893493458585")

map.put("user", user)

JSONObject json = new JSONObject(map)

System.out.println(json.toString())

}

官方的JSONArray并不支持javabean的直接转换,比如List<User>是不能转换的,必须要把它转换成List<Map>这样的格式,才能转换。

一、JSON建构有两种结构:

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组2种结构,通过这两种结构可以表示各种复杂的结构

1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。在Java中就是一种Map结构。

2、数组:数组在js中是中括号“[]”扩起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。在Java中是一种list结构。

经过对象、数组2种结构就可以组合成复杂的数据结构了。

二、Json in Javascript

使用Json语法创建对象

var people = {"name":"jack","sex":"mail"}

可以通过这种语法创建json对象,用“{}”括起来,用“,”隔开key:value

使用Json语法创建数组

var arr =[value1,value2...]

一个包含多个people的数组 peoples = [{"name":"jack","sex":"mail"},

"name":"lily","sex":"femail"}

Json数组可以通过这种语法创建,用"[]"括起来,数组元素之间用“,”分隔开,下面是这种语法的示意图:

在使用Json格式字符串与服务器交互时候,可以利用Json扩展的方法将字符串转换成一个JavaScript对象,或者将一个对象转换成Json格式字符串。不过先要登录http://www.json.org下载Json2.js文件。引入该包后,js对象直接用toJSONString()装换为字符串格式,字符串可以用parseJSON()转换成js对象。

访问数据

只需用点号表示法来表示数组元素。所以,要想访问 上面peoples列表的第一个条目的名字,只需在 JavaScript 中使用下面这样的代码:

peoples[0].name

利用这样的语法,可以处理任何 JSON 格式的数据,而不需要使用任何额外的 JavaScript 工具包或 API。

修改数据

正如可以用点号和方括号访问数据,也可以按照同样的方式轻松地修改数据:

peoples[0].name = "Rachmaninov"

在将字符串转换为 JavaScript 对象之后,就可以像这样修改变量中的数据。

由于时间关系我也没有写全,这里提供一个思路吧。代码如下:

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 = 0i <tmp.lengthi++) {

//目标值是在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反射机制进行。

以上代码运行结果: