首页 > Web开发 > 详细

使用JSLT进行对象转换

时间:2020-12-28 18:05:28      阅读:50      评论:0      收藏:0      [点我收藏+]

一.介绍与使用

JSLT是一种完整的JSON查询和转换语言。git地址:https://github.com/schibsted/jslt

 

java中使用:

<dependency>
<groupId>com.schibsted.spt.data</groupId>
<artifactId>jslt</artifactId>
<version>0.1.11</version>
<scope>compile</scope>
</dependency>

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.schibsted.spt.data.jslt.Expression;
import com.schibsted.spt.data.jslt.Parser;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;

@Slf4j
public class JsltUtil {
    /**
     * 转换json字符串(忽略异常,当异常时返回null)
     * @param jsltStr   jslt表达式
     * @param inputStr  json字符串入参
     * @return
     */
    public static String jsonAdapt(String jsltStr, String inputStr) {
        try {
            return jsonAdapt(jsltStr, inputStr, true);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("jsonAdapt error jsltStr={},inputStr={}", jsltStr, inputStr, e);
        }
        return null;
    }

    /**
     * 转换json字符串
     * @param jsltStr   jslt表达式
     * @param inputStr  json字符串入参
     * @param ignoreException  是否忽略异常 如果为ture,出现异常后返回null
     * @return
     */
    public static String jsonAdapt(String jsltStr, String inputStr, boolean ignoreException) throws IOException {
        if (StringUtils.isBlank(jsltStr) || StringUtils.isBlank(inputStr)) {
            log.info("jsonAdapt param illegal");
            return null;
        }
        try {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode input = mapper.readTree(inputStr);
            Expression jslt = Parser.compileString(jsltStr);
            JsonNode output = jslt.apply(input);
            return output.toString();
        } catch (Exception e) {
            log.error("jsonAdapt error jsltStr={},inputStr={}", jsltStr, inputStr, e);
            if (!ignoreException) {
                throw e;
            }
        }
        return null;
    }
}

  

 

二.常用转换场景示例

 

1.普通对象转换

// jslt表达式
// crowd 根据age进行if判断输出人群
{
    "name":.name,
    "age":.age,
    "crowd":if(.age<18"未成年" else if(.age<60"成年人" else "老年人"
}
// 入参:
{
    "name":"nameTest",
    "age":10
}
// 结果:
{
  "name" "nameTest",
  "age" 10,
  "crowd" "未成年"
}

 

2.子对象转换

// jslt表达式
// * : . 匹配输入对象中的所有键,除了那些已经指定的,并将它们复制到输出对象中;如果有部分字段不想全拷贝使用 :* - bar, baz, quux : .
// 注意一点, * :  这个语法必须在最后,否则会报错    子对象中,没效果 "extendMsg3":{*:.}   这个字段直接不输出(只有当对象名和入参的一样时,才能在嵌套中再用*  ,eg:"extendMsg":{*:.} 是生效的)
{
"extendMsg1":.extendMsg,
"extendMsg2":{"married2":.extendMsg.married},
*:.
}
// 入参:
{
    "name":"nameTest",
    "age":10,
    "extendMsg":{"sex":"男","married":false,"education":"小学生"}
}
// 结果:
{
  "extendMsg1" : {
    "sex" "男",
    "married" false,
    "education" "小学生"
  },
  "extendMsg2" : {
    "married2" false
  },
  "name" "nameTest",
  "age" 10,
  "extendMsg" : {
    "sex" "男",
    "married" false,
    "education" "小学生"
  }
}

 

3.子对象平铺展开/对象缩进 转换

// 展开
// jslt表达式
{
"sex":.extendMsg.sex,
"married":.extendMsg.married,
* - extendMsg:.
}
// 入参:
{
    "name":"nameTest",
    "age":10,
    "extendMsg":{"sex":"男","married":false,"education":"小学生"}
}
// 结果:
{
  "sex" "男",
  "married" false,
  "name" "nameTest",
  "age" 10
}
 
 
 
// 缩进
// jslt表达式
{
"name":.name,
"age":.age,
"extendMsg":{"sex":.sex,"married":.married,"education":.education}
}
// 入参:
{
    "name":"nameTest",
    "age":10,
    "sex":"男",
    "married":false,
    "education":"小学生"
}
// 结果:
{
  "name" "nameTest",
  "age" 10,
  "extendMsg" : {
    "sex" "男",
    "married" false,
    "education" "小学生"
  }
}

 

4.集合转换

/** 把集合全部转换 */
// jslt表达式
[for(.) {*:.}]
// 入参:
[
    {
        "name":"nameTest",
        "age":10,
        "sex":"男",
        "married":false,
        "education":"小学生"
    },
    {
        "name":"nameTest2",
        "age":102,
        "sex":"女",
        "married":true,
        "education":"女博士"
    }
]
// 结果:
// 输出和入参相同
 
 
/** 集合部分转换 */
// jslt表达式
[for(.) {"name":.name,"age":.age,"test":"testxxx"}]
// 结果:
[ {
  "name" "nameTest",
  "age" 10,
  "test" "testxxx"
}, {
  "name" "nameTest2",
  "age" 102,
  "test" "testxxx"
} ]

 

5.复杂对象(分页为例)转换

/** 1.复杂组合=基础+集合 转换;2.haveNextPaga 举例变量计算 */
// jslt表达式
{
"pageIndex":.pageNo,
"pageSize":.pageSize,
"total":.total,
"haveNextPaga":if((.total - .pageNo * .pageSize) > 0true else false,
"data":[for(.) {*:.}]
}
// 入参:
{
    "pageNo":1,
    "pageSize":2,
    "total":100,
    "list":[
        {
            "name":"nameTest",
            "age":10,
            "sex":"男",
            "married":false,
            "education":"小学生"
        },
        {
            "name":"nameTest2",
            "age":102,
            "sex":"女",
            "married":true,
            "education":"女博士"
        }
    ]
}
// 结果:
{
  "pageIndex" 1,
  "pageSize" 2,
  "total" 100,
  "haveNextPaga" true,
  "data" : [ {
    "key" "pageNo",
    "value" 1
  }, {
    "key" "pageSize",
    "value" 2
  }, {
    "key" "total",
    "value" 100
  }, {
    "key" "list",
    "value" : [ {
      "name" "nameTest",
      "age" 10,
      "sex" "男",
      "married" false,
      "education" "小学生"
    }, {
      "name" "nameTest2",
      "age" 102,
      "sex" "女",
      "married" true,
      "education" "女博士"
    } ]
  } ]
}

 

6.取集合中的某一个对象

// jslt表达式
{"data1":.[0].name,"data2":.[0].age}
// 入参:
[
    {
        "name":"nameTest",
        "age":10,
        "sex":"男",
        "married":false,
        "education":"小学生"
    },
    {
        "name":"nameTest2",
        "age":102,
        "sex":"女",
        "married":true,
        "education":"女博士"
    }
]
// 结果:{
 
  "data1" "nameTest",
  "data2" 10
}

 

使用JSLT进行对象转换

原文:https://www.cnblogs.com/taocong/p/14202651.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!