鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

Java下List与JSON格式相互转换

新增:该第三方库已不推荐使用,更好第三方库的请移步Gson–更快的json数据解析库

最近写程序设计(Java)的时候需要socket通信传输数据,并且是跨平台的,不能直接传含有类型的数据。接触过一些web开发,也写过ajax,知道可以用json或者是xml,但是考虑到xml数据冗余,决定用json。

各种找jar包

首先,我很确定各种开发语言都会提供json相关的库,于是上网直接搜转换的jar包。网上说的很简单,基本上就是调用一个函数就行,兴冲冲地去把jar包(json-lib-2.4-jdk13.jar)下下来,添加进文件。

IDE检查是没问题了,但是一运行就会出错,然后又上网debug,网上说一个jar包不够,还要其他五个jar包,于是一一搜索,把最新的全部下载,倒进去。但是运行依旧出错,继续debug,网上竟然说需要特定的版本,我也是醉了。无奈之下,按照网上说的几种搭配方式乱试一通,全都不行。近乎崩溃。

手工不行,只能上杀器了。关门,上maven。一番折腾之后,maven找到了合适的包,解决了这个问题。可以工作的jar包组合如下: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-2.4-jdk13.jar。

另引用网友的结论“java 转json 报错处理机制 案例”,如果报错可以找到对应的错误。

报错处理机制

commons-beanutils-1.8.0.jar不加这个包
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean

commons-collections.jar 不加这个包
java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap

commons-lang-2.4.jar不加这个包
java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException

commons-logging-1.1.1.jar不加这个包
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

ezmorph-1.0.4.jar不加这个包
java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher

json-lib-2.3-jdk15.jar不加这个包
java.lang.NoClassDefFoundError: net/sf/json/JSONObject

我想吐槽下,这真是垃圾的设计,实现一个简单的功能竟然要依赖多达6个包,而且更气人的是这些jar包的版本之间不能相互兼容!多么糟糕的设计啊。(或许已经有人解决了这个问题,但是没有找到,可能跟没用谷歌有关吧)。

Java中转换成json格式有两种方法,另外一种我就不写了,有兴趣的可以去这里看:Java构造和解析Json数据的两种方法详解一

最后,贴上经过测试可以运行的代码,和相应的jar包。

源码下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package javalist2json;

import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONArray;

/**
*
* @author Newnius
*/

public class JavaList2json
{
/**
* @param args the command line arguments
*/

public static void main(String[] args)
{
// TODO code application logic here
List<Integer> list = new ArrayList<>();
for(int i=0; i<3; i++)
{
list.add(new Integer(i));
}
String json=list2json(list);
System.out.println(json);
List<Integer> list2 = json2list(json);
for(Integer integer:list2)
{
System.out.println(integer);
}

}

public static String list2json(List list)
{
return JSONArray.fromObject(list).toString();
}

public static List<Integer> json2list(String str)
{
JSONArray json = JSONArray.fromObject(str);
List<Integer> list = (List<Integer>) JSONArray.toList(json, Integer.class);
return list;
}

}