JSON递归解析(一)
根据表达式递归解析json获取某个属性的值:
json示例:
{
"root":[
{
"elementA":{
"test":null
},
"elementBs":[
{
"elementNo":"test01",
"elementName":"testName1",
"elementEvent":[
"event11","event12"
]
},
{
"elementNo":"test02",
"elementName":"testName2",
"elementEvent":[
"event21","event22"
]
}
]
},
{
"elementA":{
"test":456
},
"elementBs":null
}
]
}
表达式示例:
root[0].elementBs[0].elementNo
结果:
test01
json解析使用的是Gson,以下为代码:
private static final Pattern regex1 = Pattern.compile("\\[([^}]*)\\]");
/**
* 根据param表达式递归获得json中的元素
*/
public static JsonElement recursiveGetElement(final JsonElement json, String param){
if (StringUtils.isBlank(param) || json==null){
return null;
}
JsonElement temp =json;
String[] split = param.split("\\.");
for (int i = 0; i < split.length; i++) {
if (temp==null){
break;
}
temp= GsonUtil.getElement(temp, split[i]);
}
return temp;
}
public static JsonElement getElement(JsonElement json, String paramName){
JsonElement jsonElement=null;
String regEx= "^[A-Za-z_][A-Za-z0-9$*_]*\\[\\d+\\]";
//匹配是否为数组元素
boolean matches = paramName.matches(regEx);
if (matches){
//提取中括号中的索引
Matcher matcher = regex1.matcher(paramName);
String group=null;
while (matcher.find()){
group = matcher.group(1);
}
String index =group;
if (StringUtils.isNotBlank(index)){
JsonArray jsonArray=null;
if (!json.isJsonArray()){
JsonObject asJsonObject = json.getAsJsonObject();
String substring = paramName.substring(0, paramName.length() - 3);
JsonElement element = asJsonObject.get(substring);
jsonArray= element.getAsJsonArray();
}else {
jsonArray = json.getAsJsonArray();
}
jsonElement = jsonArray.get(Integer.parseInt(index));
}
}else {
if (json.isJsonObject()){
JsonObject jsonObject = json.getAsJsonObject();
jsonElement = jsonObject.get(paramName);
}
}
return jsonElement;
}
/**
* 获得json元素的值
*/
public static String getJsonValue(JsonElement jsonElement){
String result=null;
if (jsonElement!=null){
if (jsonElement.isJsonPrimitive()){
JsonPrimitive asJsonPrimitive = jsonElement.getAsJsonPrimitive();
if (asJsonPrimitive.isString()){
result = asJsonPrimitive.getAsString();
}else {
result = asJsonPrimitive.toString();
}
}else if (jsonElement.isJsonNull()){
return null;
}else {
result = jsonElement.toString();
}
}
return result;
}
测试:
public static void main(String[] args) {
String json="{\n" +
" \"root\":[\n" +
" {\n" +
" \"elementA\":{\n" +
" \"test\":null\n" +
" },\n" +
" \"elementBs\":[\n" +
" {\n" +
" \"elementNo\":\"test01\",\n" +
" \"elementName\":\"testName1\",\n" +
" \"elementEvent\":[\n" +
" \"event11\",\"event12\"\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"elementNo\":\"test02\",\n" +
" \"elementName\":\"testName2\",\n" +
" \"elementEvent\":[\n" +
" \"event21\",\"event22\"\n" +
" ]\n" +
" }\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"elementA\":{\n" +
" \"test\":456\n" +
" },\n" +
" \"elementBs\":null\n" +
" }\n" +
" ]\n" +
"}";
JsonParser jsonParser = new JsonParser();
final JsonElement jsonElement = jsonParser.parse(json);
String param="root[0].elementBs[0].elementNo";
JsonElement temp = GsonUtil.recursiveGetElement(jsonElement, param);
String jsonValue = GsonUtil.getJsonValue(temp);
System.out.println(jsonValue);
}
浙公网安备 33010602011771号