【问题标题】:How to pick json object from a raw message string?如何从原始消息字符串中选择 json 对象?
【发布时间】:2019-09-07 09:28:16
【问题描述】:

我收到一条类似于下文所述的消息。 这只是来自服务器的示例消息。原始消息可能包含许多特殊字符。如何从消息中选择准确的 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"}]}

【问题讨论】:

  • 您能更好地解释您的问题吗?我觉得我不明白。
  • 到目前为止你有什么尝试?
  • @KunLun 我又编辑了帖子,请看一下。
  • 一个简短的解决方案可能是response.substring(response.indexOf("{\""), response.lastIndexOf("\"}")+3);,但如果indexOflastIndexOf 什么也没找到(return -1),这可能会产生错误。仅当没有另一个以 {\" 开头并以 \"} 结尾的子字符串时,此功能才有效。
  • 另一种方法是获取所有以{ 开头并以} 结尾的子字符串,并使用解析器测试它是否是json。如果您收到错误,则表示不是 json。之后,您可以检查 json 中是否存在您要查找的内容。

标签: java json message-queue org.json


【解决方案1】:

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

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;
}

输出:

{"RESCARDNUMBER":"46877801****5006","RESERRMSG":"SUCCESS","RESTXNREFCODE":"CRDHOTLIST","RESLOCALTXNDTTIME":"20190121183606","RESHDRTRANID":"CARDSTMTGEN","RESERRCODE":"0","RESTXNREFNO":"12341234", "RESINDICATOR":""}
    {"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"}]}
    {"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","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"}
    {"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"}

【讨论】:

  • 我在主帖中又添加了一个 json 示例。请看一看。
  • 添加了第二个样本的输出。我会选择正则表达式解决方案。您可以在我的回答中找到它作为第二种解决方案。您可以使用 ObjectMapper 反序列化提取的 json,检查所需字段并选择一个。
  • 添加了 json 反序列化和示例条件。
  • 您是否尝试过将输出验证为 json 对象。我在 jsonformatter.org 中尝试了第二个输出,它抛出异常。
  • @ShuvajitGhosh 这是您第二个示例的原因。有一个大 json {...{...}...[...]}(valid json) 和他的正则表达式(不是很好的正则表达式来匹配 json)首先停止 },它返回 {...{...} 这是一个无效的 json。
猜你喜欢
  • 2019-08-01
  • 2022-12-04
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多