java 扁平化输出json所有节点key/value

本文提供了一种使用Java将复杂嵌套的JSON结构转换为扁平化Map的方法,能够递归地遍历并提取所有层级的键值对,特别适用于处理带有多个嵌套层级的数据结构。

本章主要介绍用java实现扁平化输出json所有节点key/value(包含所有内层子节点)

1.json结构

目的输出bill_list下的datalist里的子节点key/value

2.实现代码

 public static Map<String, Object> jsonConvertMap(JSONObject json){
        Map<String, Object> map = new HashMap<>();
        if(json != null && json.size() > 0){
            for(String k : json.keySet()){
                Object v = json.get(k);
                if(v instanceof JSONArray){
                    List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
                    Iterator<Object> it = ((JSONArray)v).iterator();
                    while(it.hasNext()){
                        JSONObject json2 = (JSONObject) it.next();
                        list.add(jsonConvertMap(json2));
                    }
                    map.put(k, list);
                } else if(v instanceof JSONObject){
                    List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
                    JSONObject child = (JSONObject) v;
                    for(String stk: child.keySet()){
                        Object value = child.get(stk);
                        if(value instanceof JSONArray){
                            Iterator<Object> it = ((JSONArray)value).iterator();
                            while(it.hasNext()){
                                JSONObject json2 = (JSONObject) it.next();
                                list.add(jsonConvertMap(json2));
                            }
                        }else{
                            map.put(stk, value.toString());
                        }
                    }
                    if(list.size() > 0){
                        for(int m = 0;m<list.size();m++){
                            Map<String, Object> chMap = list.get(m);
                                for(String chKey : chMap.keySet()){
                                    map.put(chKey, chMap.get(chKey).toString());
                                }
                        }
                    }
                }else{
                    map.put(k, v);
                }
            }
        }
        return map;
    }

 

转载于:https://www.cnblogs.com/jiangds/p/9204789.html

<think>好的,我需要解决用户的问题:使用Java读取人员信息的JSON文件,遍历其中的键值对,生成SQL文件。首先,我得理清步骤,可能包括读取JSON文件、解析数据、生成SQL语句并写入文件。 用户提到了使用Java,所以需要选择合适的JSON库。常见的库有阿里的Fastjson和谷歌的Gson,用户提供的引用[4]中提到了这两个库的示例,这可以作为参考。根据引用[4],用户可能更倾向于使用Fastjson或Gson来处理JSON数据。 首先,步骤应该是读取JSON文件。Java中可以使用FileReader或者BufferedReader来读取文件内容。然后,需要将读取的字符解析成JSON对象或数组。假设用户提供的JSON文件结构是一个人员信息的数组,每个人员包含多个字段,比如id、name、age等。 接下来,遍历JSON数组中的每个对象,提取键值对。这里需要注意的是,不同的JSON库在解析时的API可能不同。例如,FastjsonJSONObject和Gson的JsonObject有不同的方法。根据引用[4],用户可能需要使用这些库中的方法来递归遍历所有节点,但如果是扁平化结构,可能不需要递归处理。不过用户的问题中的人员信息可能结构简单,每个人员对象是扁平的,所以可以直接获取各个字段的值。 生成SQL语句时,需要构造INSERT语句。引用[3]中有一个示例,使用字符格式化来拼接SQL语句,但需要注意SQL注入的问题。不过在这里,因为是处理已知的JSON数据,可能可以安全地拼接。不过更安全的做法是使用预编译语句,但生成SQL文件的话,可能直接拼接成字符即可。 然后,将生成的SQL语句写入到文件中。可以使用FileWriter或BufferedWriter来实现。 现在,需要考虑如何具体实现。假设使用Fastjson,根据引用[4]中的示例,可能需要解析JSON数组,遍历每个对象,然后提取键值对。例如: 1. 读取JSON文件内容为字符。 2. 使用FastjsonJSONArray.parseArray()方法将字符转为List<JSONObject>。 3. 遍历每个JSONObject,获取各个字段的值。 4. 拼接INSERT INTO语句,值部分用占位符或者直接拼接。 5. 将每条SQL语句写入SQL文件。 需要注意异常处理,比如文件不存在、JSON格式错误等。此外,字段名需要与数据库表的列名对应,可能需要用户提前创建表结构,如引用[1]中提到的创建MySQL表的步骤。 另外,用户可能希望生成的SQL文件可以直接执行,因此每条INSERT语句需要符合语法,比如字段名用反引号括起来,字符值用单引号括起来,处理特殊字符的转义等。例如,如果人员姓名中有单引号,需要转义为两个单引号。 例如,假设JSON数据如下: [ { "id": 1, "name": "张三", "age": 30, "email": "zhangsan@example.com" }, ... ] 对应的SQL语句应该是: INSERT INTO person (id, name, age, email) VALUES (1, '张三', 30, 'zhangsan@example.com'); 在Java代码中,需要将每个字段的值正确地转义,特别是字符类型。Fastjson或Gson在解析时,可以正确获取字符值,但在拼接SQL时,需要手动添加单引号,并处理内部的单引号。 此外,用户可能需要指定目标表名,或者在JSON中有不同的结构,因此代码需要有一定的灵活性。可能需要用户配置表名,或者根据JSON的键自动映射列名。 总结步骤: 1. 读取JSON文件内容。 2. 解析成JSON数组。 3. 遍历每个JSON对象。 4. 构造INSERT语句。 5. 写入SQL文件。 现在需要编写示例代码。根据引用[4],使用Fastjson的话,需要添加依赖,如pom.xml中的fastjson依赖。然后,读取文件,解析,遍历,生成SQL。 可能的代码结构: - 使用BufferedReader读取文件内容。 - 使用JSONArray.parseArray()解析为List<JSONObject>。 - 对于每个对象,获取所有键值对。 - 拼接字段名和值。 - 处理字符值的引号转义。 - 写入到SQL文件。 在转义处理方面,可以使用String的replace方法将单引号替换为两个单引号。 例如,对于字符值: String value = jsonObject.getString(key); if (value 是字符类型) { escapedValue = "'" + value.replace("'", "''") + "'"; } else { escapedValue = value.toString(); } 然后,将所有字段名用反引号括起来,值部分按上述处理。 最后,将生成的INSERT语句逐行写入SQL文件。 这样,就可以生成对应的SQL文件了。用户之后可以执行该SQL文件导入数据到数据库,如引用[1]中提到的MySQL数据库。 测试时需要注意JSON文件的结构是否正确,以及生成的SQL是否符合预期。可能还需要处理不同的数据类型,比如数字、布尔值等,确保在SQL语句中不需要加引号。 可能的问题:如果JSON中有嵌套结构,但用户的问题中说是人员信息,可能是扁平化的,所以不需要处理嵌套。如果存在嵌套,则需要进一步处理,但根据用户需求,可能不需要。 综上,示例代码可以按照上述思路编写,使用Fastjson库,读取JSON数组,生成INSERT语句,写入文件。</think>### 分步解答 #### 1. 准备JSON文件示例 假设 `person.json` 文件内容为: ```json [ { "id": 1, "name": "张三", "age": 30, "email": "zhangsan@example.com" }, { "id": 2, "name": "李四", "age": 25, "email": "lisi@example.com" } ] ``` #### 2. 添加Maven依赖(Fastjson) 在 `pom.xml` 中添加: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> ``` #### 3. Java代码实现 ```java import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.io.*; public class JsonToSqlGenerator { public static void main(String[] args) { String jsonFilePath = "person.json"; String sqlFilePath = "output.sql"; String tableName = "person"; // 目标表名 try (BufferedReader reader = new BufferedReader(new FileReader(jsonFilePath)); BufferedWriter writer = new BufferedWriter(new FileWriter(sqlFilePath))) { // 读取JSON文件内容 StringBuilder jsonContent = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { jsonContent.append(line); } // 解析JSON数组 JSONArray persons = JSONArray.parseArray(jsonContent.toString()); // 遍历每个JSON对象 for (int i = 0; i < persons.size(); i++) { JSONObject person = persons.getJSONObject(i); StringBuilder sql = new StringBuilder("INSERT INTO `" + tableName + "` ("); // 拼接字段名 person.keySet().forEach(key -> sql.append("`").append(key).append("`,")); sql.deleteCharAt(sql.length() - 1); // 删除最后一个逗号 sql.append(") VALUES ("); // 拼接字段值 person.keySet().forEach(key -> { Object value = person.get(key); if (value instanceof String) { // 处理字符转义 String escapedValue = ((String) value).replace("'", "''"); sql.append("'").append(escapedValue).append("',"); } else { sql.append(value).append(","); } }); sql.deleteCharAt(sql.length() - 1); // 删除最后一个逗号 sql.append(");\n"); // 写入SQL文件 writer.write(sql.toString()); } System.out.println("SQL文件生成成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` #### 4. 运行结果 生成的 `output.sql` 文件内容: ```sql INSERT INTO `person` (`id`,`name`,`age`,`email`) VALUES (1,'张三',30,'zhangsan@example.com'); INSERT INTO `person` (`id`,`name`,`age`,`email`) VALUES (2,'李四',25,'lisi@example.com'); ``` ### 关键点说明 1. **JSON解析**:使用Fastjson的 `JSONArray.parseArray()` 解析JSON数组[^4]。 2. **SQL注入防御**:对字符类型字段进行单引号转义(`'` → `''`)。 3. **字段动态映射**:自动提取JSON键作为表字段名,支持灵活的数据结构[^2]。 4. **文件操作**:通过 `BufferedReader` 和 `BufferedWriter` 高效读写文件[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值