利用递归实现JSON扁平化

1.引入JSON依赖包

把字符串解释成JSON再进行扁平化处理
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

2.代码实现

package com.ztesoft;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class JsonParse {

	public static void main(String[] args) {
		String jsonStr = "{\"type\":10,\"data\":[{\"text\":\"献给爱我们的女神\",\"is_liked\":false,\"index_cover\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_989_123986672_17737936936133063098.jpg?imageView/2/w/960/q/85\",\"poi\":\"\",\"cover_image_height\":816,\"trip_id\":2387282916,\"index_title\":\"\",\"center_point\":{\"age\":19,\"name\":\"小明\"},\"view_count\":36207,\"location_alias\":\"\",\"cover_image_1600\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/2/w/1384/h/1384/q/85\",\"cover_image_s\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/1/w/280/h/280/q/75\",\"share_url\":\"btrip/spot/2387842143/\",\"timezone\":\"Asia/Shanghai\",\"date_tour\":\"2016-06-19T01:19:07+08:00\",\"is_hiding_location\":false,\"user\":{\"location_name\":\"\",\"name\":\"丑到没墙角\",\"resident_city_id\":\"\",\"mobile\":\"\",\"gender\":2,\"avatar_m\":\"http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.m\",\"cover\":\"http://photos.breadtrip.com/default_user_cover_10.jpg-usercover.display\",\"custom_url\":\"\",\"experience\":{\"value\":59,\"level_info\":{\"name\":\"\",\"value\":1}},\"id\":2384288641,\"birthday\":\"\",\"country_num\":null,\"avatar_s\":\"http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.s\",\"country_code\":null,\"email_verified\":false,\"is_hunter\":false,\"cdc2\":false,\"avatar_l\":\"http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.l\",\"email\":\"\",\"user_desc\":\"\",\"points\":2},\"spot_id\":2387842143,\"is_author\":false,\"cover_image_w640\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/1/w/640/h/480/q/85\",\"region\":{\"primary\":\"\",\"secondary\":\"\"},\"comments_count\":2,\"cover_image\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/2/w/960/q/85\",\"cover_image_width\":1088,\"recommendations_count\":21}],\"desc\":\"\"}";

		Map<String, Object> flatMap = jsonFlattenAsMap(jsonStr);

		for (Map.Entry<String, Object> entry : flatMap.entrySet()) {
			System.out.println(entry.getKey() + " : " + entry.getValue());
		}
	}

	/**
	 * JSON扁平化函数
	 * 
	 * @param jsonStr
	 *            可解释jsonStr字符串
	 * @return 扁平化函数Map
	 */
	public static Map<String, Object> jsonFlattenAsMap(String jsonStr) {

		Object jsonObj = JSON.parse(jsonStr);

		// 有序HashMap
		Map<String, Object> flatMap = new LinkedHashMap<String, Object>(200);

		reduce(flatMap, "", jsonObj);

		return flatMap;
	}

	/**
	 * 递归调用
	 * 
	 * @param flatMap
	 *            结果集
	 * @param key
	 *            当前键
	 * @param jsonObj
	 *            递归对象
	 */
	private static void reduce(Map<String, Object> flatMap, String key, Object jsonObj) {

		// 如果是对象,对JSON对象进行解释
		if (jsonObj instanceof JSONObject) {
			JSONObject parseJsonObj = (JSONObject) jsonObj;

			if (parseJsonObj.isEmpty()) {
				// 如果是空对象,返回空对象
				flatMap.put(key, "{}");

			} else {

				for (Entry<String, Object> entry : parseJsonObj.entrySet()) {
					String entryKey = entry.getKey();
					Object entryValue = entry.getValue();

					String concatKey = !"".equals(key) ? key.concat(".").concat(entryKey) : entryKey;

					if (entryValue instanceof JSONObject) {
						reduce(flatMap, concatKey, entryValue);
					} else if (entryValue instanceof JSONArray) {
						reduce(flatMap, concatKey, entryValue);
					} else {
						// 放置所有连接值
						flatMap.put(concatKey, entryValue);
					}
				}
			}

		} else if (jsonObj instanceof JSONArray) {

			// 如果是数组JSONArray
			JSONArray parseJsonObj = (JSONArray) jsonObj;

			if (parseJsonObj.isEmpty()) {
				// 如果是数组,返回空集
				flatMap.put(key, "[]");

			} else {

				for (int i = 0; i < parseJsonObj.size(); i++) {
					key = key + "[" + i + "]";
					reduce(flatMap, key, parseJsonObj.get(i));
				}
			}

		}

	}

}

3.输出结果

data[0].cover_image_1600 : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/2/w/1384/h/1384/q/85
data[0].timezone : Asia/Shanghai
data[0].cover_image_height : 816
data[0].poi : 
data[0].location_alias : 
data[0].cover_image_s : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/1/w/280/h/280/q/75
data[0].is_hiding_location : false
data[0].is_author : false
data[0].index_cover : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_989_123986672_17737936936133063098.jpg?imageView/2/w/960/q/85
data[0].text : 献给爱我们的女神
data[0].cover_image : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/2/w/960/q/85
data[0].is_liked : false
data[0].index_title : 
data[0].trip_id : 2387282916
data[0].date_tour : 2016-06-19T01:19:07+08:00
data[0].spot_id : 2387842143
data[0].recommendations_count : 21
data[0].center_point.name : 小明
data[0].center_point.age : 19
data[0].cover_image_w640 : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/1/w/640/h/480/q/85
data[0].share_url : btrip/spot/2387842143/
data[0].comments_count : 2
data[0].cover_image_width : 1088
data[0].region.secondary : 
data[0].region.primary : 
data[0].user.avatar_m : http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.m
data[0].user.birthday : 
data[0].user.avatar_l : http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.l
data[0].user.email_verified : false
data[0].user.gender : 2
data[0].user.mobile : 
data[0].user.avatar_s : http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.s
data[0].user.experience.level_info.name : 
data[0].user.experience.level_info.value : 1
data[0].user.experience.value : 59
data[0].user.points : 2
data[0].user.cover : http://photos.breadtrip.com/default_user_cover_10.jpg-usercover.display
data[0].user.is_hunter : false
data[0].user.user_desc : 
data[0].user.country_code : null
data[0].user.location_name : 
data[0].user.resident_city_id : 
data[0].user.name : 丑到没墙角
data[0].user.id : 2384288641
data[0].user.cdc2 : false
data[0].user.email : 
data[0].user.custom_url : 
data[0].user.country_num : null
data[0].view_count : 36207
type : 10
desc : 
 

MySQL 的 JSON 数据类型允许你在数据库中存储和操作复杂的数据结构,但有时候需要将 JSON 数据扁平化以便于查询和分析。扁平化就是将嵌套的 JSON 结构转换为一维表结构,每个 JSON 属性都成为单独的列。 以下是扁平化处理的基本步骤: 1. **使用 JSON_EXTRACT 函数**: MySQL 提供了 `JSON_EXTRACT()` 函数可以从 JSON 对象中提取指定路径的值。例如,如果你有一个名为 `data` 的 JSON 列,你可以通过 `JSON_EXTRACT(data, '$.key')` 来提取 `key` 的值。 2. **循环遍历嵌套结构**: 如果 JSON 有多层嵌套,可能需要使用 `SUBSTRING_INDEX()` 或递归函数来逐层提取信息。这涉及到编写自定义 SQL 查询或者在应用程序中使用存储过程。 3. **创建新表或更新现有表**: 可能需要创建一个新的表来存放扁平化的数据,或者直接更新现有的表,添加新列来存储每个提取出的属性。 4. **聚合和连接**: 如果需要保留原有的关联信息,可能需要使用 JOIN 或者 GROUP BY 等 SQL 操作,将扁平化的数据与其他表联接起来。 5. **数据清洗**: 最后,清理和验证提取出的数据,确保数据完整性。 示例: 假设 JSON 数据如下: ```sql SELECT '{"person": {"name": "John", "age": 30, "address": {"city": "NY"}}}' as data; ``` 扁平化后可能会变成: ```sql CREATE TABLE flat_data ( person_name VARCHAR(255), person_age INT, address_city VARCHAR(255) ); ``` 然后插入数据: ```sql INSERT INTO flat_data (person_name, person_age, address_city) VALUES (JSON_EXTRACT(json_column, '$.person.name'), JSON_EXTRACT(json_column, '$.person.age'), JSON_EXTRACT(json_column, '$.person.address.city')); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值