springboot+thymeleaf 封装自定义解析json字符串标签方法

本文介绍了如何在Thymeleaf模板中使用ThJson类处理JSON字符串,包括解析、取值和转换,以及ThIExpressionObjectFactory和ThIExpressionFactoryDialect工厂类的实现,以支持自定义表达式在SpringBoot项目中的配置和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先是解析json字符串的方法类

一共四个方法,用于转换json或json数组,或者直接从json或json数组中取值。

package com.gnetek.ws.core.thymeleaf;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.util.List;

/**
 * thymeleaf模板自定义 json 工具方法
 *
 * @author mrchh
 * @date 2023/11/16
 */
public class ThJson {

    /**
     * 从jsonStr中获取key的值
     *
     * @param jsonStr json str
     * @param key     关键
     * @return {@link Object}
     */
    public Object getStrJson(String jsonStr, String key) {
        Object obj = null;

        if (StrUtil.isNotBlank(jsonStr) && StrUtil.isNotBlank(key)) {
            JSONObject json = JSONUtil.parseObj(jsonStr);
            obj = json.get(key);
        }

        return obj;
    }

    /**
     * 从jsonArray数组中获取第i个的值
     *
     * @param arrayStr 数组str
     * @param i        我
     * @return {@link Object}
     */
    public Object getStrArray(String arrayStr, int i) {
        Object obj = null;

        if (StrUtil.isNotBlank(arrayStr) && i>=0) {
            JSONArray jsonArray = JSONUtil.parseArray(arrayStr);
            if (i<jsonArray.size()) {
                obj = jsonArray.get(i);
            }
        }

        return obj;
    }

    /**
     * json数组转成数组
     *
     * @param arrayStr 数组str
     * @return {@link List}<{@link Object}>
     */
    public Object[] parseJsonArray(String arrayStr) {
        Object[] array = null;

        if (StrUtil.isNotBlank(arrayStr)) {
            JSONArray jsonArray = JSONUtil.parseArray(arrayStr);
            array = jsonArray.toArray();
        }

        return array;
    }

    /**
     * json字符串转成 JSONObject
     *
     * @param jsonStr json str
     * @return {@link JSONObject}
     */
    public JSONObject parseJson(String jsonStr) {
        JSONObject json = null;

        if (StrUtil.isNotBlank(jsonStr)) {
            json = JSONUtil.parseObj(jsonStr);
        }

        return json;
    }
}

二、接下来是表达式配置工厂类,以后添加别的方法也可以用,不用再写一个。

package com.gnetek.ws.core.thymeleaf;

import org.thymeleaf.context.IExpressionContext;
import org.thymeleaf.expression.IExpressionObjectFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 表达式配置工厂
 *
 * @author mrchh
 * @date 2023/11/16
 */
public class ThIExpressionObjectFactory implements IExpressionObjectFactory {

    private Map<String, Object> map;

    public ThIExpressionObjectFactory(Map<String, Object> map) {
        this.map = new HashMap<>(map);
    }

    /**
     * 获取所有表达式对象名称
     *
     * @return {@link Set}<{@link String}>
     */
    @Override
    public Set<String> getAllExpressionObjectNames() {
        return map.keySet();
    }

    /**
     * 根据表达式名字获取表达式对象
     *
     * @param iExpressionContext 表达语境
     * @param s                  名称
     * @return {@link Object}
     */
    @Override
    public Object buildObject(IExpressionContext iExpressionContext, String s) {
        return map.get(s);
    }

    /**
     * 是否允许缓存
     *
     * @param s 名称
     * @return boolean
     */
    @Override
    public boolean isCacheable(String s) {
        return true;
    }
}

三、将表达式工厂添加到springboot配置

package com.gnetek.ws.core.thymeleaf;

import org.springframework.stereotype.Component;
import org.thymeleaf.dialect.AbstractDialect;
import org.thymeleaf.dialect.IExpressionObjectDialect;
import org.thymeleaf.expression.IExpressionObjectFactory;

import java.util.HashMap;
import java.util.Map;

@Component
public class ThIExpressionFactoryDialect extends AbstractDialect implements IExpressionObjectDialect {

    private final IExpressionObjectFactory iExpressionObjectFactory;

    protected ThIExpressionFactoryDialect() {
        super("DarrenExpression");
        //map中可以多个
        Map<String, Object> map = new HashMap<>();

        //配置我们刚才写的工具类,key为页面上引用的名字
        map.put("thJson", new ThJson());

        iExpressionObjectFactory = new ThIExpressionObjectFactory(map);
    }

    @Override
    public IExpressionObjectFactory getExpressionObjectFactory() {
        return iExpressionObjectFactory;
    }
}

四、在页面中使用自定义的方法

th:alt="${#thJson.parseJson(lang.langName).zh}"
[[${#thJson.getStrJson(lang.langName, lang.langAbb)}]]
th:each="ins : ${#thJson.parseJsonArray(session.gneCompany.aboutUsIns)}"
[[${#thJson.getStrArray(session.gneCompany.companySlogan, 1)}]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值