如何从原始消息字符串中选择json对象?

时间:2019-09-07 09:28:16

标签: java json message-queue org.json

我收到一条消息,如下所示。 这只是来自服务器的示例消息。原始消息可能包含许多特殊字符。我们都知道json部分带有大括号{},因此如何从消息中选择确切的json部分。 Java中是否有任何json解析器可以解析原始消息格式并输出json对象。到目前为止,我看到的json解析器很少,但我们必须提供要解析的确切json字符串。

"hdr_Tran_Id={CARDBALANCE}~*hdr_Ref_No=1~*{res_Status=00000~}*{\"RESCARDNUMBER\":\"46877801****5006\",\"RESERRMSG\":\"SUCCESS\",\"RESTXNREFCODE\":\"CRDHOTLIST\",\"RESLOCALTXNDTTIME\":\"20190121183606\",\"RESHDRTRANID\":\"CARDSTMTGEN\",\"RESERRCODE\":\"0\",\"RESTXNREFNO\":\"12341234\", \"RESINDICATOR\":\"\"}"

如何在大括号{}中选择邮件的一部分

{\"RESCARDNUMBER\":\"46877801****5006\",\"RESERRMSG\":\"SUCCESS\",\"RESTXNREFCODE\":\"CRDHOTLIST\",\"RESLOCALTXNDTTIME\":\"20190121183606\",\"RESHDRTRANID\":\"CARDSTMTGEN\",\"RESERRCODE\":\"0\",\"RESTXNREFNO\":\"12341234\", \"RESINDICATOR\":\"\"}

由于一条消息可能包含多个大括号,而少数大括号可能不包含json消息。

这是供观看者使用的另一个原始字符串示例。

hdr_Tran_Id=LISTOFCARDS~*hdr_Ref_No=1~*res_Status=00000~*{"ResErrMsg":"SUCCESS","ResTxnRefNo":"12341234","ResMobileNumber":"9448925643","ResTxnRefCode":"LISTOFCARDS","ResErrCode":"0","ResHdrTranID":"LISTOFCARDS","ResLocalTxnDtTime":"20190121174837","ResCardNumList":[{"ResMobileNum":"9448925643","ResEmailId":"krishnakumarj@canarabank.com","ResCustName":"KRISHNA KUMAR J","ResCustAddr":"CANARA BANK,CANCARD DIVISION,14, NAVEEN COMPLEX,M G ROAD,BANGALORE,INDIA","ResBirthDate":"02-04-1968","ResCardNumber":"4770360117595007","ResPhoneNum":"25582496"},{"ResMobileNum":"9448925643","ResCustName":"KRISHNA KUMAR J","ResCustAddr":"CANARA BANK,CANCARD DIVISION,VI FLOOR, NAVEEN COMPLEX,M G ROAD,BANGALORE,INDIA","ResBirthDate":"02-04-1968","ResCardNumber":"5298700103122003","ResPhoneNum":"25582896"},{"ResMobileNum":"9448925643","ResEmailId":"krish_jkk7@yahoo.co.in","ResCustName":"KRISHNA KUMAR J","ResCustAddr":"CANARA BANK,NAVEEN COMPLEX,DBS WING ,###,BANGALORE,INDIA","ResBirthDate":"02-04-1968","ResCardNumber":"6082010100018008"},{"ResMobileNum":"9448925643","ResCustName":"KRISHNA KUMAR J","ResCustAddr":"CANARA BANK,EDP SN CANCARD DIVN,14 M G ROAD,NAVEEN COMPLEX,BANGALORE,INDIA","ResBirthDate":"02-04-1968","ResCardNumber":"4687780160098009","ResPhoneNum":"9448925643"}]}

1 个答案:

答案 0 :(得分:0)

您可以使用String方法lastIndexOf或regexp表达式。在以下代码中,您可以找到regexp解决方案:

dat$APE <- as.factor(substr(dat$APE, 1, 2))

输出:

public static void main(String[] args) throws IOException {
    String raw1 = "hdr_Tran_Id={CARDBALANCE}~*hdr_Ref_No=1~*{res_Status=00000~}*{\"RESCARDNUMBER\":\"46877801****5006\",\"RESERRMSG\":\"SUCCESS\",\"RESTXNREFCODE\":\"CRDHOTLIST\",\"RESLOCALTXNDTTIME\":\"20190121183606\",\"RESHDRTRANID\":\"CARDSTMTGEN\",\"RESERRCODE\":\"0\",\"RESTXNREFNO\":\"12341234\", \"RESINDICATOR\":\"\"}";
    String raw2 = "hdr_Tran_Id=LISTOFCARDS~*hdr_Ref_No=1~*res_Status=00000~*{\"ResErrMsg\":\"SUCCESS\",\"ResTxnRefNo\":\"12341234\",\"ResMobileNumber\":\"9448925643\",\"ResTxnRefCode\":\"LISTOFCARDS\",\"ResErrCode\":\"0\",\"ResHdrTranID\":\"LISTOFCARDS\",\"ResLocalTxnDtTime\":\"20190121174837\",\"ResCardNumList\":[{\"ResMobileNum\":\"9448925643\",\"ResEmailId\":\"krishnakumarj@canarabank.com\",\"ResCustName\":\"KRISHNA KUMAR J\",\"ResCustAddr\":\"CANARA BANK,CANCARD DIVISION,14, NAVEEN COMPLEX,M G ROAD,BANGALORE,INDIA\",\"ResBirthDate\":\"02-04-1968\",\"ResCardNumber\":\"4770360117595007\",\"ResPhoneNum\":\"25582496\"},{\"ResMobileNum\":\"9448925643\",\"ResCustName\":\"KRISHNA KUMAR J\",\"ResCustAddr\":\"CANARA BANK,CANCARD DIVISION,VI FLOOR, NAVEEN COMPLEX,M G ROAD,BANGALORE,INDIA\",\"ResBirthDate\":\"02-04-1968\",\"ResCardNumber\":\"5298700103122003\",\"ResPhoneNum\":\"25582896\"},{\"ResMobileNum\":\"9448925643\",\"ResEmailId\":\"krish_jkk7@yahoo.co.in\",\"ResCustName\":\"KRISHNA KUMAR J\",\"ResCustAddr\":\"CANARA BANK,NAVEEN COMPLEX,DBS WING ,###,BANGALORE,INDIA\",\"ResBirthDate\":\"02-04-1968\",\"ResCardNumber\":\"6082010100018008\"},{\"ResMobileNum\":\"9448925643\",\"ResCustName\":\"KRISHNA KUMAR J\",\"ResCustAddr\":\"CANARA BANK,EDP SN CANCARD DIVN,14 M G ROAD,NAVEEN COMPLEX,BANGALORE,INDIA\",\"ResBirthDate\":\"02-04-1968\",\"ResCardNumber\":\"4687780160098009\",\"ResPhoneNum\":\"9448925643\"}]}";
    Set<String> result = new HashSet<>();
    result.addAll(extractJson(raw1, Pattern.compile("(\\{.*?\\})")));
    result.addAll(extractJson(raw1, Pattern.compile("(\\{.*\\[.*?\\]\\})")));
    result.addAll(extractJson(raw2, Pattern.compile("(\\{.*?\\})")));
    result.addAll(extractJson(raw2, Pattern.compile("(\\{.*\\[.*?\\]\\})")));
    result.forEach(System.out::println);
}

private static Set<String> extractJson(String raw, Pattern p) throws IOException {
    Set<String> jsons = new HashSet<>();
    Matcher m = p.matcher(raw);
    while (m.find()) {
        String groupJson = m.group(1);
        ObjectMapper mapper = new ObjectMapper();
        TypeReference<HashMap<String, Object>> typeRef
                = new TypeReference<HashMap<String, Object>>() {
        };

        try {
            Map<String, Object> map = mapper.readValue(groupJson, typeRef);
            jsons.add(groupJson);
        } catch (JsonParseException e) {
            //ignore
        }
    }
    return jsons;
}