zoukankan      html  css  js  c++  java
  • 一段字符串中间提取json字符串

    项目过程中经常打日志:LOG.error("[failure][CreateOrder] param:{}", JSON.toJSONString(userCreateOrderDTO),e);
     
    在一些日志处理过程中我们打印的日志可能是这个样的 XXX业务处理异常:{json字符串}
     
    我们怎么获取到只包含json的字符串呢?
     
    下面提供Java和JS两种方式:
    <wiz_code_mirror>
     
     
     
     
     
    function getJson(jsonStr) {
        var stringStack = new stack();
        var indexList = [];
        var jsonList = [];
        for (var i = 0; i < jsonStr.length; i++) {
            if (jsonStr.charAt(i) == '{' || jsonStr.charAt(i) == '[') {
                stringStack.push(new JsonStack(i, jsonStr.charAt(i)));
            } else if (jsonStr.charAt(i) == '}' || jsonStr.charAt(i) == ']') {
                if (stringStack.dataStore.length!=0) {
                    var js = stringStack.peek();
                    if (jsonStr.charAt(i) == '}' && js.char == '{') {
                        js = stringStack.pop();
                    } else if (jsonStr.charAt(i) == ']' && js.char == '[') {
                        js = stringStack.pop();
                    }
                    indexList.push(js.index);
                    indexList.push(i);
                }
            }
            if (stringStack.dataStore.length==0 && indexList.length > 0) {
                var tempStr = getJsonStr(indexList, jsonStr);
                if (!(tempStr == null || tempStr.length == 0)) {
                    jsonList.push(tempStr);
                }
                indexList.splice(0,indexList.length);;
            }
        }
        if (indexList != null && indexList.length > 0) {
            var tempStr = getJsonStr(indexList, jsonStr);
            if (!(tempStr == null || tempStr.length == 0)) {
                jsonList.push(tempStr);
            }
        }
        if (jsonList != null && jsonList.length > 0) {
            return jsonList[0];
        } else {
            return null;
        }
    }
    function getJsonStr(indexList, str) {
        var temp = "";
        for (var i = indexList.length - 1; i >= 0; i = i - 2) {
            try {
                temp = str.substring(indexList[i - 1], indexList[i] + 1);
                JSON.parse(temp);
                return temp;
            } catch (e) {
                continue;
            }
        }
        return null;
    }
    function JsonStack(index, char) {
        this.index = index;
        this.char = char;
    }
    function stack() {
        this.dataStore = [];//保存栈内元素,初始化为一个空数组
        this.top = 0;//栈顶位置,初始化为0
        this.push = push;//入栈
        this.pop = pop;//出栈
        this.peek = peek;//查看栈顶元素
        this.clear = clear;//清空栈
        this.length = length;//栈内存放元素的个数
    }
    function push(element) {
        this.dataStore[this.top++] = element;
    }
    function pop() {
        return this.dataStore[--this.top];
    }
    function peek() {
        return this.dataStore[this.top - 1];
    }
    function clear() {
        this.top = 0;
    }
    function length() {
        return this.top;
    }
     
     
    <wiz_code_mirror>
     
     
     
     
     
    package com.ucarinc.bizops.log;
    import com.alibaba.fastjson.JSON;
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Stack;
    /**
     * Created by zhangbo on 2017/12/29.
     */
    public class FindJsonUtil {
        public static List<String> format(String jsonStr) {
            Stack<JsonStack> stringStack = new Stack<JsonStack>();
            List<Integer> indexList = new LinkedList<Integer>();
            List<String> jsonList = new ArrayList<String>();
            for (int i = 0;i<jsonStr.length();i++) {
                if(jsonStr.charAt(i)=='{'||jsonStr.charAt(i)=='['){
                    stringStack.push(new JsonStack(i,jsonStr.charAt(i)));
                }else if(jsonStr.charAt(i)=='}'||jsonStr.charAt(i)==']'){
                    if(!stringStack.empty()){
                        JsonStack js = stringStack.peek();
                        if(jsonStr.charAt(i)=='}'&&js.getStr() =='{'){
                            js = stringStack.pop();
                        }else if(jsonStr.charAt(i)==']'&&js.getStr() =='['){
                            js = stringStack.pop();
                        }
                        indexList.add(js.getIndex());
                        indexList.add(i);
                    }
                    if(stringStack.empty()){
                        String tempStr= getJsonStr(indexList,jsonStr);
                        if(!(tempStr==null||tempStr.isEmpty())){
                            jsonList.add(tempStr);
                        }
                        indexList.clear();
                    }
                }
            }
            if(indexList!=null && indexList.size()>0){
                String tempStr= getJsonStr(indexList,jsonStr);
                if(!(tempStr==null||tempStr.isEmpty())) {
                    jsonList.add(tempStr);
                }
            }
            return jsonList;
        }
        private static String getJsonStr(List<Integer> indexList,String str) {
            String temp= "";
            for(int i = indexList.size() -1 ; i>=0 ; i=i-2){
                try {
                    temp = str.substring(indexList.get(i - 1), indexList.get(i)+1);
                    JSON.parse(temp);
                    return str.substring(indexList.get(i - 1), indexList.get(i)+1);
                }catch (Exception e){
                    continue;
                }
            }
            return null;
        }
        static class JsonStack{
            private Integer index;
            private char str;
            public JsonStack(Integer index, char str) {
                this.index = index;
                this.str = str;
            }
            public Integer getIndex() {
                return index;
            }
            public void setIndex(Integer index) {
                this.index = index;
            }
            public Character getStr() {
                return str;
            }
            public void setStr(Character str) {
                this.str = str;
            }
        }
    }
     
     
     
     
  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/jgig11/p/8145903.html
Copyright © 2011-2022 走看看