其他分享
首页 > 其他分享> > 使用JSLT进行对象转换

使用JSLT进行对象转换

作者:互联网

一.介绍与使用

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 }

 

标签:转换,name,jslt,对象,age,married,sex,JSLT,education
来源: https://www.cnblogs.com/taocong/p/14202651.html