首页 > 其他分享 >json字符串解析 多语言替换

json字符串解析 多语言替换

时间:2023-06-13 21:33:59浏览次数:34  
标签:return String language json keyMap removeI18nKey key 字符串 解析

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;


@Slf4j
public class I18nKeyReplaceServiceImpl implements I18nKeyReplaceService {

    @Value("${cms.i18n.switch:true}")
    private Boolean configSwitch;

    @Value("${cms.i18n.debugLog.switch:true}")
    private boolean enableLog;

    private final String LANGUAGE_TAG = "__LANG__";

    /**
     * @param data          业务数据json
     * @param language      语言
     * @param removeI18nKey 是否删除国际化多语言字段
     * @return 结果
     */
    @Override
    public String handleI18n(String data, String language, boolean removeI18nKey) {
        if (configSwitch == null || !configSwitch) {
            return data;
        }

        if (StringUtils.isBlank(data) || StringUtils.isBlank(language)) {
            return data;
        }

        if (enableLog && log.isDebugEnabled()) {
            log.debug("handleI18n request, language={} removeI18nKey={} data={}", language, removeI18nKey, data);
        }

        Object newData = null;
        if (this.isArray(data)) {
            List<Object> list = JsonUtils.jsonToList(data);
            listAndMap(list, language, removeI18nKey);
            newData = list;
        } else {
            Map<String, Object> dataMap = JsonUtils.jsonToMap(data);
            handleI18n(dataMap, language, removeI18nKey);
            newData = dataMap;
        }

        String result = JsonUtils.objectToJson(newData);

        if (enableLog && log.isDebugEnabled()) {
            log.debug("handleI18n response, result={}", result);
        }
        return result;
    }

    /**
     * @param keyMap        业务数据json
     * @param language      语言
     * @param removeI18nKey 是否删除国际化多语言字段
     * @return 结果
     */
    @Override
    public Map<String, Object> handleI18n(Map<String, Object> keyMap, String language, boolean removeI18nKey) {
        if (MapUtils.isEmpty(keyMap)) {
            return keyMap;
        }

        if (enableLog && log.isDebugEnabled()) {
            log.debug("handleI18n request map, language={} removeI18nKey={} keyMap={}", language, removeI18nKey, JsonUtils.objectToJson(keyMap));
        }

        Set<String> keysRemoved = new HashSet<>(0);//需要删除的key
        Set<String> keys = new HashSet<>(keyMap.keySet());
        for (String key : keys) {
            Object value = keyMap.get(key);
            //1.处理KEY
            if (key.contains(LANGUAGE_TAG)) {
                String languageSuffix = this.addLanguageTag(language);
                if (key.endsWith(languageSuffix)) {
                    String originalKey = removeLanguageSuffixIfExist(key, languageSuffix);
                    keyMap.put(originalKey, value);
                }

                //移除多语言字段
                if (removeI18nKey) {
                    keysRemoved.add(key);
                }
                continue;
            }

            //2.处理Value,继续多语言字段值替换
            if (value instanceof Map) {
                handleI18n((Map) value, language, removeI18nKey);
            } else if (value instanceof List) {
                listAndMap((List) value, language, removeI18nKey);
            } else if (value instanceof String) {
                if (this.isArray((String) value)) {
                    List<Object> list = JsonUtils.jsonToList((String) value);
                    listAndMap(list, language, removeI18nKey);
                    keyMap.put(key, JsonUtils.objectToJson(list));
                }
            }
        }
        //删除key
        if (!keysRemoved.isEmpty()) {
            removeAllI18nKey(keyMap, keysRemoved);
        }

        if (enableLog && log.isDebugEnabled()) {
            log.debug("handleI18n response map, result={}", JsonUtils.objectToJson(keyMap));
        }
        return keyMap;
    }

    private boolean isArray(String jsonStr) {
        return StringUtils.isNotBlank(jsonStr) && jsonStr.startsWith("[");
    }

    /**
     * list 集合处理
     *
     * @param list
     * @param language
     * @param removeI18nKey
     */
    private void listAndMap(List list, String language, boolean removeI18nKey) {
        if (list.size() > 0 && list.get(0) instanceof Map) {
            for (Object o : list) {
                handleI18n((Map) o, language, removeI18nKey);
            }
        }
    }

    /**
     * @param language
     * @return
     */
    private String buildLanguageSuffix(String language) {
        return LANGUAGE_TAG + language;
    }

    /**
     * @param key
     * @param languageSuffix
     * @return
     */
    private String removeLanguageSuffixIfExist(String key, String languageSuffix) {
        return key.substring(0, key.lastIndexOf(languageSuffix));
    }

    /**
     * @param key
     * @return
     */
    private String addLanguageTag(String key) {
        return LANGUAGE_TAG + key;
    }


    private void removeAllI18nKey(Map<String, Object> pageKeyMap, Set<String> removeKey) {
        pageKeyMap.keySet().removeAll(removeKey);
    }

    public void setConfigSwitch(Boolean configSwitch) {
        this.configSwitch = configSwitch;
    }
}

  

标签:return,String,language,json,keyMap,removeI18nKey,key,字符串,解析
From: https://www.cnblogs.com/niun/p/17478762.html

相关文章

  • 模块(os、json、pickle)
    os模块主要与操作系统打交道,是与操作系统交互的一个窗口1.os.mkdir('dirname')创建单级目录dirname2.os.makedirs('dirname1/dirname2')生成多层递归目录dirnmae1下的dirname23.os.rmdir('dirname')删除空白单级目录dirname,若dirname不为空则无法删除,并报错 ......
  • 2023全国卷甲卷理科数学Word解析版
    前言真题图片相关下载2023年高考全国甲卷理科数学真题版+解析版,提取码请微信联系:wh1979448597.......
  • .NET指定图片地址下载并转换Base64字符串
    需求描述    需要调用第三方图片上传接口上传图片,对方图片格式只能接收Base64字符串。所以我们需要将系统服务器的图片通过Url下载下来,然后转换成Base64字符串。接下来我们将使用HttpClient类库下载图片并将其转换为Base64格式的字符串。代码示例///<summary>......
  • post、raw、json调用第三方接口
    1、调用第三方接口,对方接口文档写到”请求方式postjson格式、请求参数json格式“,看不懂,就用postMan试试看。发现只有一种方式能调用通, 2、 3、Content-Type:application/json  4、根据上面的方式,所有写了下面的方法:/****@paramurl接口地址*@paramputData......
  • JavaCV音视频开发宝典:使用JavaCV读取海康平台或海康网络摄像头sdk回调视频TS码流并解
    《JavaCV音视频开发宝典》专栏目录导航《JavaCV音视频开发宝典》专栏介绍和目录​前言两年前博主写了如何利用JavaCV解析各种h264裸流,《JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并解析预览图像》,但是随着时间变化,各个厂商sdk也......
  • java中 怎么把字符串转成 double
    Java中可以使用Double类中的静态方法 parseDouble() 将一个字符串转换为double类型的数值。用法如下:Stringstr="3.14";doublenumber=Double.parseDouble(str);在上述代码中,我们首先定义一个字符串 str,它包含了要转换的数值。然后,我们使用 parseDouble() 方法将字......
  • java中 怎么把字符串转成 double
    Java中可以使用Double类中的静态方法 parseDouble() 将一个字符串转换为double类型的数值。用法如下:Stringstr="3.14";doublenumber=Double.parseDouble(str);在上述代码中,我们首先定义一个字符串 str,它包含了要转换的数值。然后,我们使用 parseDouble() 方法将字......
  • 443.压缩字符串
    问题描述443.压缩字符串解题思路双指针、滑动窗口,注意for循环中不需要fast++。代码classSolution{public:intcompress(vector<char>&chars){vector<char>res;intcnt=0;for(intslow=0,fast=0;fast<chars.size();){......
  • 926.将字符串翻转到单调递增
    问题描述926.将字符串翻转到单调递增(Medium)如果一个二进制字符串,是以一些0(可能没有0)后面跟着一些1(也可能没有1)的形式组成的,那么该字符串是单调递增的。给你一个二进制字符串s,你可以将任何0翻转为1或者将1翻转为0。返回使s单调递增的最小翻转次数。示例......
  • 1405.最长快乐字符串
    问题描述1405.最长快乐字符串(Medium)如果字符串中不含有任何'aaa','bbb'或'ccc'这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。给你三个整数a,b,c,请你返回任意一个满足下列全部条件的字符串s:s是一个尽可能长的快乐字符串。s中最多有a个字母'......