Java中JSON字符串转有序Map
目录
概述
在Java开发中,经常需要将JSON字符串转换为Map对象。默认情况下,大多数JSON库生成的Map是无序的(如HashMap),但在某些业务场景下,我们需要保持JSON的键值对顺序。本文将介绍几种实现方式并提供完整的工具类。
常用JSON库对比
| 特性 | Jackson | Gson | FastJson | JSON-B |
|---|---|---|---|---|
| 性能 | 高 | 中 | 很高 | 中 |
| 功能完整性 | 高 | 中 | 高 | 中 |
| 社区活跃度 | 高 | 中 | 高 | 中 |
| 支持有序Map | 是 | 是 | 是 | 是 |
Jackson实现方式
1. 基础实现
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.LinkedHashMap;
import java.util.Map;
public class JacksonJsonUtils {
private static final ObjectMapper objectMapper = new ObjectMapper();
/**
* 将JSON字符串转换为有序Map
* @param jsonString JSON字符串
* @return 有序Map
*/
public static Map<String, Object> jsonToOrderedMap(String jsonString) {
try {
TypeReference<LinkedHashMap<String, Object>> typeRef =
new TypeReference<LinkedHashMap<String, Object>>() {};
return objectMapper.readValue(jsonString, typeRef);
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
/**
* 将JSON字符串转换为指定类型的Map
* @param jsonString JSON字符串
* @param valueType Map值类型
* @return 有序Map
*/
public static <T> Map<String, T> jsonToOrderedMap(String jsonString, Class<T> valueType) {
try {
TypeReference<LinkedHashMap<String, T>> typeRef =
new TypeReference<LinkedHashMap<String, T>>() {};
return objectMapper.readValue(jsonString, typeRef);
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
}
2. 高级配置实现
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.DeserializationFeature;
import java.util.LinkedHashMap;
import java.util.Map;
public class JacksonAdvancedUtils {
private static final ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
// 配置序列化特性
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// 配置反序列化特性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
}
/**
* 将JSON字符串转换为有序Map(支持嵌套结构)
* @param jsonString JSON字符串
* @return 有序Map
*/
public static Map<String, Object> jsonToNestedOrderedMap(String jsonString) {
try {
return objectMapper.readValue(jsonString,
new TypeReference<LinkedHashMap<String, Object>>() {});
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
}
Gson实现方式
1. 基础实现
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
import java.util.Map;
public class GsonJsonUtils {
private static final Gson gson = new Gson();
/**
* 将JSON字符串转换为有序Map
* @param jsonString JSON字符串
* @return 有序Map
*/
public static Map<String, Object> jsonToOrderedMap(String jsonString) {
try {
Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
return gson.fromJson(jsonString, type);
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
/**
* 将JSON字符串转换为指定类型的Map
* @param jsonString JSON字符串
* @param valueType Map值类型
* @return 有序Map
*/
public static <T> Map<String, T> jsonToOrderedMap(String jsonString, Class<T> valueType) {
try {
Type type = new TypeToken<LinkedHashMap<String, T>>(){}.getType();
return gson.fromJson(jsonString, type);
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
}
2. 自定义Gson配置
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
import java.util.Map;
public class GsonCustomUtils {
private static final Gson gson;
static {
gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.serializeNulls()
.create();
}
/**
* 将JSON字符串转换为有序Map(支持日期格式化)
* @param jsonString JSON字符串
* @return 有序Map
*/
public static Map<String, Object> jsonToOrderedMapWithDate(String jsonString) {
try {
Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
return gson.fromJson(jsonString, type);
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
}
FastJson实现方式
1. 基础实现
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.LinkedHashMap;
import java.util.Map;
public class FastJsonUtils {
/**
* 将JSON字符串转换为有序Map
* @param jsonString JSON字符串
* @return 有序Map
*/
public static Map<String, Object> jsonToOrderedMap(String jsonString) {
try {
return JSON.parseObject(jsonString,
new TypeReference<LinkedHashMap<String, Object>>(){});
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
/**
* 将JSON字符串转换为指定类型的Map
* @param jsonString JSON字符串
* @param valueType Map值类型
* @return 有序Map
*/
public static <T> Map<String, T> jsonToOrderedMap(String jsonString, Class<T> valueType) {
try {
return JSON.parseObject(jsonString,
new TypeReference<LinkedHashMap<String, T>>(){});
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
}
2. FastJson配置版本
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.TypeReference;
import java.util.LinkedHashMap;
import java.util.Map;
public class FastJsonConfigUtils {
/**
* 将JSON字符串转换为有序Map(带配置)
* @param jsonString JSON字符串
* @return 有序Map
*/
public static Map<String, Object> jsonToOrderedMap(String jsonString) {
try {
return JSON.parseObject(jsonString,
new TypeReference<LinkedHashMap<String, Object>>(){},
Feature.OrderedField);
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
}
自定义工具类
1. 通用工具类
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* JSON工具类 - 支持多种JSON库和有序Map
* @author Your Name
* @version 1.0
*/
public class JsonOrderedMapUtils {
// 支持的JSON库类型
public enum JsonLibrary {
JACKSON, GSON, FASTJSON, AUTO
}
// 缓存ObjectMapper实例
private static final Map<JsonLibrary, Object> jsonParsers = new ConcurrentHashMap<>();
// 默认使用Jackson
private static JsonLibrary defaultLibrary = JsonLibrary.JACKSON;
/**
* 设置默认JSON库
* @param library JSON库类型
*/
public static void setDefaultLibrary(JsonLibrary library) {
defaultLibrary = library;
}
/**
* 将JSON字符串转换为有序Map(自动选择JSON库)
* @param jsonString JSON字符串
* @return 有序Map
*/
public static Map<String, Object> jsonToOrderedMap(String jsonString) {
return jsonToOrderedMap(jsonString, defaultLibrary);
}
/**
* 将JSON字符串转换为有序Map(指定JSON库)
* @param jsonString JSON字符串
* @param library JSON库类型
* @return 有序Map
*/
public static Map<String, Object> jsonToOrderedMap(String jsonString, JsonLibrary library) {
if (StringUtils.isEmpty(jsonString)) {
return new LinkedHashMap<>();
}
try {
switch (library) {
case JACKSON:
return parseWithJackson(jsonString);
case GSON:
return parseWithGson(jsonString);
case FASTJSON:
return parseWithFastJson(jsonString);
case AUTO:
return parseAuto(jsonString);
default:
throw new IllegalArgumentException("不支持的JSON库类型: " + library);
}
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
/**
* 将JSON字符串转换为指定类型的Map
* @param jsonString JSON字符串
* @param valueType Map值类型
* @return 有序Map
*/
public static <T> Map<String, T> jsonToOrderedMap(String jsonString, Class<T> valueType) {
return jsonToOrderedMap(jsonString, valueType, defaultLibrary);
}
/**
* 将JSON字符串转换为指定类型的Map(指定JSON库)
* @param jsonString JSON字符串
* @param valueType Map值类型
* @param library JSON库类型
* @return 有序Map
*/
public static <T> Map<String, T> jsonToOrderedMap(String jsonString, Class<T> valueType, JsonLibrary library) {
if (StringUtils.isEmpty(jsonString)) {
return new LinkedHashMap<>();
}
try {
switch (library) {
case JACKSON:
return parseWithJackson(jsonString, valueType);
case GSON:
return parseWithGson(jsonString, valueType);
case FASTJSON:
return parseWithFastJson(jsonString, valueType);
case AUTO:
return parseAuto(jsonString, valueType);
default:
throw new IllegalArgumentException("不支持的JSON库类型: " + library);
}
} catch (Exception e) {
throw new RuntimeException("JSON转换失败: " + e.getMessage(), e);
}
}
// Jackson解析实现
private static Map<String, Object> parseWithJackson(String jsonString) {
try {
ObjectMapper mapper = getJacksonMapper();
TypeReference<LinkedHashMap<String, Object>> typeRef =
new TypeReference<LinkedHashMap<String, Object>>() {};
return mapper.readValue(jsonString, typeRef);
} catch (Exception e) {
throw new RuntimeException("Jackson解析失败: " + e.getMessage(), e);
}
}
private static <T> Map<String, T> parseWithJackson(String jsonString, Class<T> valueType) {
try {
ObjectMapper mapper = getJacksonMapper();
TypeReference<LinkedHashMap<String, T>> typeRef =
new TypeReference<LinkedHashMap<String, T>>() {};
return mapper.readValue(jsonString, typeRef);
} catch (Exception e) {
throw new RuntimeException("Jackson解析失败: " + e.getMessage(), e);
}
}
// Gson解析实现
private static Map<String, Object> parseWithGson(String jsonString) {
try {
Gson gson = getGsonParser();
Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
return gson.fromJson(jsonString, type);
} catch (Exception e) {
throw new RuntimeException("Gson解析失败: " + e.getMessage(), e);
}
}
private static <T> Map<String, T> parseWithGson(String jsonString, Class<T> valueType) {
try {
Gson gson = getGsonParser();
Type type = new TypeToken<LinkedHashMap<String, T>>(){}.getType();
return gson.fromJson(jsonString, type);
} catch (Exception e) {
throw new RuntimeException("Gson解析失败: " + e.getMessage(), e);
}
}
// FastJson解析实现
private static Map<String, Object> parseWithFastJson(String jsonString) {
try {
return JSON.parseObject(jsonString,
new TypeReference<LinkedHashMap<String, Object>>(){});
} catch (Exception e) {
throw new RuntimeException("FastJson解析失败: " + e.getMessage(), e);
}
}
private static <T> Map<String, T> parseWithFastJson(String jsonString, Class<T> valueType) {
try {
return JSON.parseObject(jsonString,
new TypeReference<LinkedHashMap<String, T>>(){});
} catch (Exception e) {
throw new RuntimeException("FastJson解析失败: " + e.getMessage(), e);
}
}
// 自动选择解析方式
private static Map<String, Object> parseAuto(String jsonString) {
// 按优先级尝试:Jackson -> Gson -> FastJson
try {
return parseWithJackson(jsonString);
} catch (Exception e1) {
try {
return parseWithGson(jsonString);
} catch (Exception e2) {
try {
return parseWithFastJson(jsonString);
} catch (Exception e3) {
throw new RuntimeException("所有JSON库都无法解析: " + e3.getMessage(), e3);
}
}
}
}
private static <T> Map<String, T> parseAuto(String jsonString, Class<T> valueType) {
try {
return parseWithJackson(jsonString, valueType);
} catch (Exception e1) {
try {
return parseWithGson(jsonString, valueType);
} catch (Exception e2) {
try {
return parseWithFastJson(jsonString, valueType);
} catch (Exception e3) {
throw new RuntimeException("所有JSON库都无法解析: " + e3.getMessage(), e3);
}
}
}
}
// 获取Jackson ObjectMapper
private static ObjectMapper getJacksonMapper() {
return (ObjectMapper) jsonParsers.computeIfAbsent(JsonLibrary.JACKSON, k -> {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
return mapper;
});
}
// 获取Gson解析器
private static Gson getGsonParser() {
return (Gson) jsonParsers.computeIfAbsent(JsonLibrary.GSON, k ->
new GsonBuilder()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.serializeNulls()
.create()
);
}
/**
* 将Map转换为JSON字符串
* @param map Map对象
* @return JSON字符串
*/
public static String mapToJson(Map<String, ?> map) {
return mapToJson(map, defaultLibrary);
}
/**
* 将Map转换为JSON字符串(指定JSON库)
* @param map Map对象
* @param library JSON库类型
* @return JSON字符串
*/
public static String mapToJson(Map<String, ?> map, JsonLibrary library) {
if (map == null || map.isEmpty()) {
return "{}";
}
try {
switch (library) {
case JACKSON:
return getJacksonMapper().writeValueAsString(map);
case GSON:
return getGsonParser().toJson(map);
case FASTJSON:
return JSON.toJSONString(map);
default:
throw new IllegalArgumentException("不支持的JSON库类型: " + library);
}
} catch (Exception e) {
throw new RuntimeException("Map转JSON失败: " + e.getMessage(), e);
}
}
/**
* 验证JSON字符串是否有效
* @param jsonString JSON字符串
* @return 是否有效
*/
public static boolean isValidJson(String jsonString) {
if (StringUtils.isEmpty(jsonString)) {
return false;
}
try {
jsonToOrderedMap(jsonString);
return true;
} catch (Exception e) {
return false;
}
}
/**
* 获取JSON字符串的键集合(保持顺序)
* @param jsonString JSON字符串
* @return 键集合
*/
public static Set<String> getJsonKeys(String jsonString) {
Map<String, Object> map = jsonToOrderedMap(jsonString);
return map.keySet();
}
/**
* 获取JSON字符串的键值对数量
* @param jsonString JSON字符串
* @return 键值对数量
*/
public static int getJsonSize(String jsonString) {
Map<String, Object> map = jsonToOrderedMap(jsonString);
return map.size();
}
}
2. 字符串工具类
/**
* 字符串工具类
*/
class StringUtils {
/**
* 判断字符串是否为空
* @param str 字符串
* @return 是否为空
*/
public static boolean isEmpty(String str) {
return str == null || str.trim().isEmpty();
}
/**
* 判断字符串是否不为空
* @param str 字符串
* @return 是否不为空
*/
public static boolean isNotEmpty(String str) {
return !isEmpty(str);
}
}
使用示例
1. 基础使用
public class JsonExample {
public static void main(String[] args) {
// 示例JSON字符串
String jsonString = "{\"name\":\"张三\",\"age\":25,\"city\":\"北京\"}";
// 使用默认JSON库(Jackson)
Map<String, Object> map1 = JsonOrderedMapUtils.jsonToOrderedMap(jsonString);
System.out.println("默认解析结果: " + map1);
// 指定使用Gson
Map<String, Object> map2 = JsonOrderedMapUtils.jsonToOrderedMap(jsonString, JsonLibrary.GSON);
System.out.println("Gson解析结果: " + map2);
// 指定使用FastJson
Map<String, Object> map3 = JsonOrderedMapUtils.jsonToOrderedMap(jsonString, JsonLibrary.FASTJSON);
System.out.println("FastJson解析结果: " + map3);
// 自动选择JSON库
Map<String, Object> map4 = JsonOrderedMapUtils.jsonToOrderedMap(jsonString, JsonLibrary.AUTO);
System.out.println("自动选择结果: " + map4);
}
}
2. 复杂JSON处理
public class ComplexJsonExample {
public static void main(String[] args) {
// 复杂JSON字符串
String complexJson = "{\"user\":{\"name\":\"李四\",\"age\":30},\"orders\":[{\"id\":1,\"product\":\"手机\"},{\"id\":2,\"product\":\"电脑\"}],\"total\":2999.99}";
try {
// 解析复杂JSON
Map<String, Object> result = JsonOrderedMapUtils.jsonToOrderedMap(complexJson);
// 访问嵌套数据
@SuppressWarnings("unchecked")
Map<String, Object> user = (Map<String, Object>) result.get("user");
String userName = (String) user.get("name");
Integer userAge = (Integer) user.get("age");
@SuppressWarnings("unchecked")
List<Map<String, Object>> orders = (List<Map<String, Object>>) result.get("orders");
Double total = (Double) result.get("total");
System.out.println("用户名: " + userName);
System.out.println("年龄: " + userAge);
System.out.println("订单数量: " + orders.size());
System.out.println("总金额: " + total);
// 验证JSON有效性
boolean isValid = JsonOrderedMapUtils.isValidJson(complexJson);
System.out.println("JSON是否有效: " + isValid);
// 获取所有键
Set<String> keys = JsonOrderedMapUtils.getJsonKeys(complexJson);
System.out.println("所有键: " + keys);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 类型安全的使用
public class TypeSafeExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"王五\",\"score\":95.5,\"passed\":true}";
try {
// 指定值类型为Object(默认)
Map<String, Object> map1 = JsonOrderedMapUtils.jsonToOrderedMap(jsonString);
// 指定值类型为String
Map<String, String> map2 = JsonOrderedMapUtils.jsonToOrderedMap(jsonString, String.class);
// 指定值类型为Number
Map<String, Number> map3 = JsonOrderedMapUtils.jsonToOrderedMap(jsonString, Number.class);
System.out.println("Object类型: " + map1);
System.out.println("String类型: " + map2);
System.out.println("Number类型: " + map3);
} catch (Exception e) {
e.printStackTrace();
}
}
}
性能对比
1. 解析性能测试
public class PerformanceTest {
private static final String TEST_JSON = "{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":\"value3\",\"key4\":\"value4\",\"key5\":\"value5\"}";
private static final int ITERATIONS = 100000;
public static void main(String[] args) {
System.out.println("性能测试开始...");
System.out.println("测试JSON: " + TEST_JSON);
System.out.println("迭代次数: " + ITERATIONS);
System.out.println();
// 测试Jackson
long startTime = System.currentTimeMillis();
for (int i = 0; i < ITERATIONS; i++) {
JsonOrderedMapUtils.jsonToOrderedMap(TEST_JSON, JsonLibrary.JACKSON);
}
long jacksonTime = System.currentTimeMillis() - startTime;
// 测试Gson
startTime = System.currentTimeMillis();
for (int i = 0; i < ITERATIONS; i++) {
JsonOrderedMapUtils.jsonToOrderedMap(TEST_JSON, JsonLibrary.GSON);
}
long gsonTime = System.currentTimeMillis() - startTime;
// 测试FastJson
startTime = System.currentTimeMillis();
for (int i = 0; i < ITERATIONS; i++) {
JsonOrderedMapUtils.jsonToOrderedMap(TEST_JSON, JsonLibrary.FASTJSON);
}
long fastJsonTime = System.currentTimeMillis() - startTime;
// 输出结果
System.out.println("性能测试结果:");
System.out.println("Jackson: " + jacksonTime + "ms");
System.out.println("Gson: " + gsonTime + "ms");
System.out.println("FastJson: " + fastJsonTime + "ms");
System.out.println();
// 计算相对性能
System.out.println("相对性能(以Jackson为基准):");
System.out.println("Jackson: 1.0x");
System.out.println("Gson: " + String.format("%.2fx", (double) gsonTime / jacksonTime));
System.out.println("FastJson: " + String.format("%.2fx", (double) fastJsonTime / jacksonTime));
}
}
最佳实践
1. 选择JSON库的建议
- 生产环境: 推荐使用Jackson,性能稳定,功能完整
- 快速开发: 可以使用FastJson,性能最好
- Android开发: 推荐使用Gson,体积小,兼容性好
- 企业级应用: 推荐使用Jackson,社区支持好
2. 性能优化建议
- 缓存ObjectMapper等解析器实例
- 对于大量重复解析,考虑使用对象池
- 避免在循环中重复创建解析器
- 使用TypeReference缓存类型信息
3. 错误处理建议
- 始终使用try-catch包装JSON操作
- 提供有意义的错误信息
- 考虑使用自定义异常类型
- 记录详细的错误日志
4. 线程安全考虑
- Jackson的ObjectMapper是线程安全的
- Gson实例是线程安全的
- FastJson实例是线程安全的
- 建议使用单例模式管理解析器
依赖配置
在开始使用工具类之前,请确保在项目中添加相应的依赖。
Maven依赖
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
<!-- Gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!-- FastJson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
Gradle依赖
// Jackson
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
// Gson
implementation 'com.google.code.gson:gson:2.10.1'
// FastJson
implementation 'com.alibaba:fastjson:2.0.32'
总结
本文提供了Java中将JSON字符串转换为有序Map的完整解决方案,包括:
- 多种JSON库支持: Jackson、Gson、FastJson
- 完整的工具类: 支持自动选择、类型安全、错误处理
- 性能对比: 帮助选择最适合的JSON库
- 最佳实践: 生产环境的使用建议
通过这些工具类,您可以轻松地在Java项目中处理JSON数据,同时保持键值对的顺序,满足各种业务需求。
1476

被折叠的 条评论
为什么被折叠?



