目录
原始JSON格式数据
{
"msg": "成功",
"code": "200",
"data": [{
"studentName": "Foo",
"subjects": [{
"name": "English",
"marks": "40"
},
{
"name": "History",
"marks": "50"
}
],
"Age": "12"
},
{
"studentName": "Bar",
"subjects": [{
"name": "English",
"marks": "40"
},
{
"name": "History",
"marks": "50"
},
{
"name": "Science",
"marks": "40"
}
],
"Age": "12"
},
{
"studentName": "Baz",
"subjects": [],
"Age": "12"
}
]
}
转换后数据
[{
"code": "200",
"data.Age": "12",
"data.studentName": "Foo",
"data.subjects.marks": "40",
"data.subjects.name": "English",
"msg": "成功"
}, {
"code": "200",
"data.Age": "12",
"data.studentName": "Foo",
"data.subjects.marks": "50",
"data.subjects.name": "History",
"msg": "成功"
}, {
"code": "200",
"data.Age": "12",
"data.studentName": "Bar",
"data.subjects.marks": "40",
"data.subjects.name": "English",
"msg": "成功"
}, {
"code": "200",
"data.Age": "12",
"data.studentName": "Bar",
"data.subjects.marks": "50",
"data.subjects.name": "History",
"msg": "成功"
}, {
"code": "200",
"data.Age": "12",
"data.studentName": "Bar",
"data.subjects.marks": "40",
"data.subjects.name": "Science",
"msg": "成功"
}, {
"code": "200",
"data.Age": "12",
"data.studentName": "Baz",
"msg": "成功"
}]
实现代码
package net.eternalable.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author tangyi tangyi703@sina.com
* @version 1.0
* @description JSON 上下级合并成行显示
* @date 2019/5/17 13:04
*/
@Slf4j
public class JsonUtil17 {
private static String str = "{"msg":"成功","code":"200","data":[{"studentName":"Foo","subjects":[{"name":"English","marks":"40"},{"name":"History","marks":"50"}],"Age":"12"},{"studentName":"Bar","subjects":[{"name":"English","marks":"40"},{"name":"History","marks":"50"},{"name":"Science","marks":"40"}],"Age":"12"},{"studentName":"Baz","subjects":[],"Age":"12"}]}";
@Test
public void test() {
JSONObject jsonObject0 = JSONArray.parseObject(str);
List<Map<String, String>> rows = new ArrayList<Map<String, String>>();
paseJsonToRow(rows, null, null, jsonObject0);
log.info("eachRow:{}", JSON.toJSONString(rows));
}
/***
*
* @param rows 最终行数据数组
* @param parent 上级属性和值
* @param prex 前缀,即JSON中路径
* @param jsonObject0 需要合并的JSON对象
*/
public void paseJsonToRow(List<Map<String, String>> rows, Map<String, String> parent, String prex, JSONObject jsonObject0) {
//当前节点所有属性
Map<String, String> valus = new HashMap<String, String>();
if (parent != null) {
valus.putAll(parent);
}
//当前节点子节点属性列表
List<String> children = new ArrayList<String>();
for (String key : jsonObject0.keySet()
) {
if (!checkIsJson(jsonObject0.getString(key))) {
if (prex != null) {
valus.put(prex + "." + key, jsonObject0.getString(key));
} else {
valus.put(key, jsonObject0.getString(key));
}
} else {
children.add(key);
}
}
for (String key : children) {
String subprex = key;
if (prex != null) {
subprex = prex + "." + subprex;
}
if (checkIsArray(jsonObject0.getString(key))) {
paseJsonToRow(rows, valus, subprex, jsonObject0.getJSONArray(key));
} else {
paseJsonToRow(rows, valus, subprex, jsonObject0.getJSONObject(key));
}
}
if (children == null || children.size() == 0) {
rows.add(valus);
}
}
/***
*
* @param rows 最终行数据数组
* @param parent 上级属性和值
* @param prex 前缀,即JSON中路径
* @param jsonArray 需要合并的JSON数组
*/
public void paseJsonToRow(List<Map<String, String>> rows, Map<String, String> parent, String prex, JSONArray jsonArray) {
//如果没有子节点为空,则改行结束
//否则继续遍历
if (jsonArray.size() == 0) {
rows.add(parent);
} else {
for (int i = 0; i < jsonArray.size(); i++) {
paseJsonToRow(rows, parent, prex, jsonArray.getJSONObject(i));
}
}
}
/***
* 判断是单个值还是JSON对象,
* 如果是JSON对象说明还有下级,需继续遍历
* @param string
* @return
*/
public boolean checkIsJson(String string) {
Object object = null;
try {
object = JSON.parse(string);
} catch (Exception e) {
}
if (object instanceof JSONObject) {
return true;
} else if (object instanceof JSONArray) {
return true;
} else {
return false;
}
}
/**
* 判断是否是JSON数组
*
* @param string
* @return
*/
public boolean checkIsArray(String string) {
Object object = JSON.parse(string);
if (object instanceof JSONObject) {
return false;
} else {
return true;
}
}
}