You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Java中按序读取JSON文件并转换为有序哈希的方案

嘿,我来帮你搞定这个问题!在Java里读取JSON并保留(或重新排序)键的顺序其实很简单,咱们分两种场景来处理:


1. 保留JSON文件里的原始键顺序

因为普通的HashMap是无序的,所以咱们可以用LinkedHashMap——它会严格保留键的插入顺序(也就是JSON文件里的键顺序)。下面用两种常用的JSON库来演示:

用Jackson库实现

首先确保你的项目里引入了Jackson的依赖(Maven的话,在pom.xml里加这段):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 用最新稳定版即可 -->
</dependency>

然后编写读取代码:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.MapType;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class OrderedJsonReader {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 明确指定要解析成LinkedHashMap,确保顺序不会丢失
            MapType mapType = objectMapper.getTypeFactory()
                    .constructMapType(LinkedHashMap.class, String.class, List.class);
            LinkedHashMap<String, List<String>> orderedMap = 
                    objectMapper.readValue(new File("your-json-file.json"), mapType);
            
            // 直接获取有序的键列表
            List<String> originalOrderedKeys = new ArrayList<>(orderedMap.keySet());
            System.out.println("JSON原始顺序的键列表:" + originalOrderedKeys);
            
            // 遍历有序的键值对
            for (String key : originalOrderedKeys) {
                System.out.println(key + " => " + orderedMap.get(key));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

用Gson库实现

如果习惯用Gson,同样要先引入依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 最新稳定版即可 -->
</dependency>

代码示例:

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class GsonOrderedReader {
    public static void main(String[] args) {
        Gson gson = new Gson();
        try (FileReader reader = new FileReader("your-json-file.json")) {
            // 用TypeToken指定LinkedHashMap类型
            TypeToken<LinkedHashMap<String, List<String>>> typeToken = new TypeToken<>() {};
            LinkedHashMap<String, List<String>> orderedMap = 
                    gson.fromJson(reader, typeToken.getType());
            
            List<String> originalOrderedKeys = new ArrayList<>(orderedMap.keySet());
            System.out.println("JSON原始顺序的键列表:" + originalOrderedKeys);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 对键进行自定义排序

如果你不需要原始顺序,而是想按自己的规则排序(比如字母顺序、字符串长度等),可以把键取出来后手动排序:

// 承接上面的orderedMap
import java.util.Collections;
import java.util.Comparator;
import java.util.stream.Collectors;

// 按字母升序排序
List<String> sortedKeysAsc = new ArrayList<>(orderedMap.keySet());
Collections.sort(sortedKeysAsc);

// 按字母降序排序
List<String> sortedKeysDesc = orderedMap.keySet().stream()
        .sorted(Comparator.reverseOrder())
        .collect(Collectors.toList());

// 按字符串长度排序(短的在前)
List<String> sortedByLength = orderedMap.keySet().stream()
        .sorted(Comparator.comparingInt(String::length))
        .collect(Collectors.toList());

// 遍历排序后的键值对
for (String key : sortedKeysAsc) {
    System.out.println(key + " => " + orderedMap.get(key));
}

小提示

  • Jackson默认解析JSON对象时就会用LinkedHashMap,但显式指定类型会更稳妥,避免后续版本变更出问题。
  • 如果你的JSON文件很大,记得用流式解析来优化内存占用,但一般小文件用上面的方法完全没问题。

内容的提问来源于stack exchange,提问作者MSOUFAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:15:39