list的对象只能转化为数组对象的格式Exception in thread "main" net.sf.json.JSONException: 'object' is an array. Use JSONArray instead

java中JSON可以有两种格式,一种是对象格式的,另一种是数组对象,

//JSON的对象格式的字符串
{"name":"JSON","address":"西安高新区","age":18}
//数组对象格式
[{"name":"JSON","address":"西安高新区","age":18}]

从上面的两种格式可以看出对象格式和数组对象格式唯一的不同则是在对象格式的基础上加上了[],再来看具体的结构,可以看出都是以键值对的形式出现的,中间以英文状态下的逗号(,)分隔。

在前端和后端进行数据传输的时候这种格式也是很受欢迎的,后端返回json格式的字符串,前台使用js中的JSON.parse()方法把JSON字符串解析为json对象,然后进行遍历,供前端使用。

要想实现JSON和java对象之间的互转,需要借助第三方jar包,这里使用json-lib这个jar包,下载地址为:https://sourceforge.net/projects/json-lib/,json-lib需要

commons-beanutils-1.8.0.jar、
commons-collections-3.2.1.jar、
commons-lang-2.5.jar、
commons-logging-1.1.1.jar、

ezmorph-1.0.6.jar五个包的支持,可以自行从网上下载

json-lib提供了几个类可以完成此功能,例,JSONObject、JSONArray。从类的名字上可以看出JSONObject转化的应该是对象格式的,而JSONArray转化的则应该是数组对象(即,带[]形式)的。

一、定义一个java实体类

java普通对象指的是java中的一个java bean,即一个实体类,如,package com.cn.study.day3;

public class Student {
//姓名
private String name;
//年龄
private String age;
//住址
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", address="
+ address + "]";
}
}

二、list和json字符串的互转public static void listToJSON(){

Student stu=new Student();
stu.setName("JSON");
stu.setAge("18");
stu.setAddress("西安高新区");
List lists=new ArrayList();
lists.add(stu);
//1、使用JSONObject
//JSONObject listObject=JSONObject.fromObject(lists);
//2、使用JSONArray
JSONArray listArray=JSONArray.fromObject(lists);
//System.out.println("listObject:"+listObject.toString());
System.out.println("listArray:"+listArray.toString());
}

我把使用JSONObject的方式给注掉了,我们先看注释之前的结果,

Exception in thread "main" net.sf.json.JSONException: 'object' is an array. Use JSONArray instead

告诉我说有一个异常,通过查看源码发现,在使用fromObject方法的时候会先进行参数类型的判断,这里就告诉我们,传入的参数是一个array类型,因为使用的ArrayList,再来看,注释之后的结果,

listArray:[{"address":"西安高新区","age":"18","name":"JSON"}]

这样结果是正常的。

2、json字符串转list

从上面的例子可以看出list的对象只能转化为数组对象的格式,那么我们看下面的字符串到list的转化,public static void jsonToList(){

String arrayStr="[{\"name\":\"JSON\",\"age\":\"24\",\"address\":\"北京市西城区\"}]";
//转化为list
List list2=(List)JSONArray.toList(JSONArray.fromObject(arrayStr), Student.class);
for (Student stu : list2) {
System.out.println(stu);
}
//转化为数组
Student[] ss =(Student[])JSONArray.toArray(JSONArray.fromObject(arrayStr),Student.class);
for (Student student : ss) {
System.out.println(student);
}
}

打印结果,

Student [name=JSON, age=24, address=北京市西城区]
Student [name=JSON, age=24, address=北京市西城区]

由于字符串的格式为带有“[]”的格式,所以这里选择JSONArray这个对象,它有toArray、toList方法可供使用,前者转化为java中的数组,或者转化为java中的list,由于这里有实体类进行对应,所以在使用时指定了泛型的类型(Student.class),这样就可以得到转化后的对象。