JSON字符串怎么转集合:从入门到精通
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读性和灵活性被广泛使用,我们经常需要将从接口接收的JSON字符串转换为程序中的集合对象(如List、Set等),以便进行数据处理,本文将详细介绍JSON字符串转集合的方法,涵盖手动解析、第三方库(如Gson、Jackson、Fastjson)的使用,以及常见问题的解决方案。
JSON字符串与集合的关系
首先需要明确:JSON字符串转集合的本质,是将符合JSON格式的字符串数据,映射为Java中的集合类型(如List<Map<String, Object>>、List<User>等),JSON字符串[{"name":"张三","age":20},{"name":"李四","age":22}]可以转换为List<User>或List<Map<String, Object>>,其中每个元素对应JSON数组中的一个对象。
手动解析JSON字符串(不推荐)
虽然不推荐在实际项目中使用手动解析(代码冗余、容错性差),但了解其原理有助于理解后续库的工作方式,假设JSON字符串为[{"name":"张三","age":20}],手动解析步骤如下:
使用org.json库(需引入依赖)
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>
解析代码
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class ManualJsonParse {
public static void main(String[] args) {
String jsonString = "[{\"name\":\"张三\",\"age\":20}]";
List<User> userList = new ArrayList<>();
// 解析JSON数组
JSONArray jsonArray = new JSONArray(jsonString);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
userList.add(new User(name, age));
}
System.out.println(userList); // 输出: [User{name='张三', age=20}]
}
}
class User {
private String name;
private int age;
// 构造方法、getter/setter省略
}
缺点:代码量大,需手动处理每个字段,JSON格式变化时需修改代码,且无法处理复杂嵌套结构。
使用第三方库解析(推荐)
实际开发中,推荐使用成熟的第三方库(如Gson、Jackson、Fastjson),它们能简化代码、提升效率,并支持复杂场景。
Gson(Google)
(1)引入依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
(2)基本用法
Gson通过Gson对象的fromJson()方法解析JSON字符串,支持直接转换为List<T>(需指定泛型类型)。
示例1:转List<Map<String, Object>>
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
public class GsonDemo1 {
public static void main(String[] args) {
String jsonString = "[{\"name\":\"张三\",\"age\":20},{\"name\":\"李四\",\"age\":22}]";
Gson gson = new Gson();
// 使用TypeToken指定泛型类型
Type type = new TypeToken<List<Map<String, Object>>>() {}.getType();
List<Map<String, Object>> list = gson.fromJson(jsonString, type);
list.forEach(map -> System.out.println(map));
// 输出: {name=张三, age=20.0}、{name=李四, age=22.0}
}
}
示例2:转List<User>(自定义对象)
import com.google.gson.Gson;
import java.util.List;
public class GsonDemo2 {
public static void main(String[] args) {
String jsonString = "[{\"name\":\"张三\",\"age\":20}]";
Gson gson = new Gson();
// 直接指定List<User>类型(需User类有无参构造方法)
List<User> userList = gson.fromJson(jsonString, new TypeToken<List<User>>() {}.getType());
System.out.println(userList); // 输出: [User{name='张三', age=20}]
}
}
(3)注意事项
- 若JSON字段与Java对象属性名不一致,可通过
@SerializedName注解映射:class User { @SerializedName("userName") private String name; // JSON中的userName映射到name // 其他字段... } - 集合元素需有无参构造方法(Gson通过反射创建对象)。
Jackson(Spring Boot默认)
(1)引入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
(2)基本用法
Jackson通过ObjectMapper的readValue()方法解析,与Gson类似,但功能更强大(如支持注解、流式解析)。
示例1:转List<Map<String, Object>>
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;
public class JacksonDemo1 {
public static void main(String[] args) throws Exception {
String jsonString = "[{\"name\":\"张三\",\"age\":20}]";
ObjectMapper mapper = new ObjectMapper();
// 使用TypeReference指定泛型类型
List<Map<String, Object>> list = mapper.readValue(jsonString, new TypeReference<List<Map<String, Object>>>() {});
list.forEach(System.out::println);
}
}
示例2:转List<User>
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonDemo2 {
public static void main(String[] args) throws Exception {
String jsonString = "[{\"name\":\"张三\",\"age\":20}]";
ObjectMapper mapper = new ObjectMapper();
// 直接转换为List<User>
List<User> userList = mapper.readValue(jsonString, new TypeReference<List<User>>() {});
System.out.println(userList);
}
}
(3)注意事项
- Jackson要求对象有无参构造方法,且字段需有getter/setter(或
public访问权限)。 - 可通过
@JsonProperty注解解决字段名不匹配问题:class User { @JsonProperty("userName") private String name; // 其他字段... } - 默认不支持JSON字符串中的
null值转换为Java对象的null,可通过mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)忽略未知属性。
Fastjson(阿里巴巴)
(1)引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.40</version>
</dependency>
(2)基本用法
Fastjson以简洁的API著称,直接使用JSON.parseArray()或JSON.parseObject()即可。
示例1:转List<Map<String, Object>>
import com.alibaba.fastjson.JSON;
import java.util.List;
import java.util.Map;
public class FastjsonDemo1 {
public static void main(String[] args) {
String jsonString = "[{\"name\":\"张三\",\"age\":20}]";
// 直接解析为List<Map>
List<Map<String, Object>> list = JSON.parseArray(jsonString, Map.class);
list.forEach(System.out::println);
}
}
示例2:转List<User>
import com.alibaba.fastjson.JSON;
import java.util.List;
public class FastjsonDemo2 {
public static void main(String[] args) {
String jsonString = "[{\"name\":\"张三\",\"age\":20}]";
// 指定元素类型为User
List<User> userList = JSON.parseArray(jsonString, User.class);
System.out.println(userList);
}
}
(3)注意事项
- Fastjson在1.x版本中存在安全漏洞(如远程代码执行),建议使用2.x版本(修复了大部分安全问题)。
- 字段映射可通过
@JSONField注解实现:class User { @JSONField(name = "userName") private String name; // 其他字段... }
常见问题与解决方案
JSON字符串格式错误(如缺少引号、括号不匹配)
- 问题:
com.google.gson.JsonSyntaxException或com.fasterxml.jackson.core.JsonParseException。 - 解决:使用在线JSON格式化工具(如[JSONLint](https://



还没有评论,来说两句吧...