我有一个大文本文件。它混合了更多的线与各种信息
我的要求是从混合字符串行下面检索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 } }
请帮忙, 感谢
答案 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)
有两种解决方案:
使用正则表达式
不建议使用正则表达式:
有时它们可能效率很低。参见this
和this
。
即使您要使用正则表达式,也可以通过以下方法解决此问题:
请参阅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字符串。