无法使用JSONObject更改Json中存在的属性值

xam8gpfp  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(116)

这里我需要你的帮助,因为我的要求是有一个名为transactionReferenceNumber的属性的值,它位于JSON路径Request.eventDetails.message部分。
当然,由于对JSON路径遍历知之甚少,我能够使用JSONObject遍历Request.eventDetails.message直到Request.eventDetails.message,如下面的代码片段所示,但无法遍历message部分并获取或更改transactionReferenceNumber属性或任何其他属性的值。

String filepath = System.getProperty("user.dir") +
    "/src/test/resources/Json_Files/Payment_Events_Api_PayLoad.json";
String jsonContents = new String((Files.readAllBytes(Paths.get(filepath))));
JSONObject jsonObject = new JSONObject(jsonContents);
            
String Message = jsonObject.getJSONObject("request")
    .getJSONObject("eventDetails")
    .get("message")
    .toString();

下面是JSON供大家参考:

{
    "metadata": {
        "requestId": "e1d0db1f-ac7d-4011-b34e-c063b6d638a6",
        "signature": "ZwcQa6YozllV1mLWPrZFiacSguRoEibSgmb97UvTrWgvuY5I76eWuAg==",
        "signatureAlgorithm": "SH443222wesd"
    },
    "request": {
        "eventId": "e43e2222-2c91-47d8-8c03-9a5f52db15a2",
        "eventCode": "EADFE",
        "eventCategory": "PAYMENT_STATUS",
        "eventType": "TRANSACTION_STATUS",
        "eventDetails": {
            "paymentProduct": "CXC",
            "message": "{ \"achCompanyId\": \"3131231\", \"companyName\": \"ABC Company\", \"transactionReferenceNumber\": \"4333\", \"remittanceInfo\": \"Paroll Processing\", \"processingDate\": \"2022-01-12\", \"payeeFirstname\": \"John\", \"payeeIDType\": \"email\", \"payeeEmail\": \"abc.Doe@gmail.com\", \"payeeMobile\": \"\", \"paymentType\": \"STANDARD\", \"paymentAmount($)\": 600.50, \"numberOfHoldDays\": 5, \"currentPaymentStatus\": \"PENDING\"}",
            "messageFormat": "CUSTOM.CXC.JSON"
        },
        "timeStamp": "2020-07-21T14:53:54-0400"
    }
}

请大家在这个问题上帮助我,并提出解决这个问题的可能方法。
先谢谢你了。

ssgvzors

ssgvzors1#

JSON中的“message”值是一个包含另一个JSON对象的字符串,而不是直接的JSON对象,这意味着您不能使用getJSONObject()或类似的方法直接遍历它。你需要做的是将“message”解析为一个单独的JSON对象,只有这样你才能修改它的值:

String filepath = System.getProperty("user.dir") +
    "/src/test/resources/Json_Files/Payment_Events_Api_PayLoad.json";
String jsonContents = new String((Files.readAllBytes(Paths.get(filepath))));
JSONObject jsonObject = new JSONObject(jsonContents);
            
String messageStr = jsonObject.getJSONObject("request")
    .getJSONObject("eventDetails")
    .getString("message");

// get message separately
JSONObject messageJson = new JSONObject(messageStr);

// modify your value
messageJson.put("transactionReferenceNumber", "NewValue");

// replace the old message string with the modified one
jsonObject.getJSONObject("request")
    .getJSONObject("eventDetails")
    .put("message", messageJson.toString());

相关问题