使用JAVA从Mixed String中提取Json String

时间:2016-12-06 09:07:41

标签: java json gson

我有一个大文本文件。它混合了更多的线与各种信息

我的要求是从混合字符串行下面检索json

行:

PID: [0] [STM] [2016-12-01 00:00:00,135]  INFORMATION {com.priyan.JsonParser} -  My Req Body: { "amountTxn": { "paymentAmt": { "amtReserved": null, "totalAmtCharged": null, "chargingData": { "taxAmt": 10, "categoryCode": "MyApp" }, "totalAmountRefunded": null, "chargingInformation": { "amount": 1.5, "description": ["Test 01 (demo)"] } }, "userId": "tel:+2313215", "txnStatus": "Charged", "origCode": null, "seq": null } } TOKEN ID: 351351 {com.priyan.JsonParser}

我只需要提取这个json部分

{ "amountTxn": { "paymentAmt": { "amtReserved": null, "totalAmtCharged": null, "chargingData": { "taxAmt": 10, "categoryCode": "MyApp" }, "totalAmountRefunded": null, "chargingInformation": { "amount": 1.5, "description": ["Test 01 (demo)"] } }, "userId": "tel:+2313215", "txnStatus": "Charged", "origCode": null, "seq": null } }

请帮忙, 感谢

5 个答案:

答案 0 :(得分:3)

你可以使用正则表达式^.*Body:\s(.*)\sTOKEN.*来提取你想要的数据,提供 JSON数据两边的相邻单词不会改变,我的意思是单词"Body: "(包括空格)和" TOKEN"

此正则表达式基本上提取"Body: "" TOKEN"

之间的文本

答案 1 :(得分:2)

创建一个类似于JSON的类,然后使用Jackson [Java JSON解析器(http://jackson.codehaus.org)]库。请参阅Parsing JSON File Java了解更多信息

答案 2 :(得分:2)

这将找到您需要的第二个括号的位置(因为INFORMATION和TOKEN块)并对您需要的内容进行子串。

所以基本上,我搜索第二个(通过在第一个之后找到括号)并且结束相同的事情。然后只需提取字符串。

public static void main(String[] args){
        String s = "PID: [0] [STM] [2016-12-01 00:00:00,135]  INFORMATION {com.priyan.JsonParser} -  My Req Body: { \"amountTxn\": { \"paymentAmt\": { \"amtReserved\": null, \"totalAmtCharged\": null, \"chargingData\": { \"taxAmt\": 10, \"categoryCode\": \"MyApp\" }, \"totalAmountRefunded\": null, \"chargingInformation\": { \"amount\": 1.5, \"description\": [\"Test 01 (demo)\"] } }, \"userId\": \"tel:+2313215\", \"txnStatus\": \"Charged\", \"origCode\": null, \"seq\": null } } TOKEN ID: 351351 {com.priyan.JsonParser}";
        int begin = s.indexOf("{", s.indexOf("{") + 1);
        int end = s.lastIndexOf("}", s.lastIndexOf("}") - 1);
        s = s.substring(begin, end);
        System.out.println(s);
    }

如果不在之前和/或之后的文本有任何括号但可以根据其他模式更新,则此解决方案不起作用。

答案 3 :(得分:2)

有两种解决方案:

  1. 使用正则表达式
  2. 编写自己的解析器以实现解决方案

使用正则表达式

不建议使用正则表达式: 有时它们可​​能效率很低。参见thisthis

即使您要使用正则表达式,也可以通过以下方法解决此问题:

请参阅this

编写自己的解析器以实现解决方案:

void getJsonFromString(String input) {

        List<Character> stack = new ArrayList<Character>();
        List<String> jsons = new ArrayList<String>();
        String temp = "";
        for(char eachChar: input.toCharArray()) {
            if(stack.isEmpty() && eachChar == '{') {
                stack.add(eachChar);
                temp += eachChar;
            } else if(!stack.isEmpty()) {
                temp += eachChar;
                if(stack.get(stack.size()-1).equals('{') && eachChar == '}') {
                    stack.remove(stack.size()-1);
                    if(stack.isEmpty()) {
                        jsons.add(temp);
                        temp = "";
                    }
                }
                else if(eachChar == '{' || eachChar == '}')
                    stack.add(eachChar);
            } else if(temp.length()>0 && stack.isEmpty()) {
                jsons.add(temp);
                temp = "";
            }
        }
        for(String json: jsons)
            System.out.println(json);
    }

答案 4 :(得分:1)

如果线条有固定的图案,你只需得到“我的需要身体”和“JSON”之间的部分。这很容易。

如果该行没有固定模式,则可以从第一个索引“{”开始,然后继续构建JSON字符串。您需要计算打开的花括号的数量,并在达到相同数量的闭括号时停止获取字符串。拥有字符串后,您可以使用像gson这样的库来验证它是否是有效的JSON字符串。