【问题标题】:Retrieve value from returned JSON object in Java从 Java 中返回的 JSON 对象中检索值
【发布时间】:2021-11-09 21:20:27
【问题描述】:

我是一个接收 JSON 对象的人,我需要将值保存到我的数据库中。但我在弄清楚如何检索 JSON 对象中的特定值时遇到了问题。

在这种情况下,我想检索 'originationNumber' 和 'messageBody' 的值

响应对象 -

{"originationNumber":"***","destinationNumber":"***","messageKeyword":"KEYWORD_***","messageBody":"Answer ","previousPublishedMessageId":"1slamq6mdpucd8q4i7iabf1sikc629ga253tr6o0","inboundMessageId":"88bc02fc-aff3-4277-ac1d-f27b6d3b6abb"}

接收消息的方法-

public String getReceivedMessages(Messaging receivedMessage) {

    BasicAWSCredentials awsCredentials = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
    AmazonSQS sqsClient = AmazonSQSClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
            .withRegion(String.valueOf(awsRegion)).build();

    StringBuilder sb = new StringBuilder();
    String queueUrl = "https://sqs.us-east-1.amazonaws.com/1234567/GetReceivedMessages";
    List<Message> messages = sqsClient.receiveMessage(new ReceiveMessageRequest(queueUrl)
            .withMaxNumberOfMessages(1).withWaitTimeSeconds(20)).getMessages();
    for (Message message : messages) {
        sb.append(message.getBody());
        sqsClient.deleteMessage(queueUrl, message.getReceiptHandle());
    }

    // Save messages to DB
    String userId = connectionRequestRepository.getUserId();
    Date date = new Date();
    Timestamp now = new Timestamp(date.getTime());

    receivedMessage.setUserId(userId);
    receivedMessage.setOriginationNumber("");
    receivedMessage.setDestinationNumber("***");
    receivedMessage.setMessageBody("");
    receivedMessage.setMessageType("RECEIVED");
    receivedMessage.setCreatedAt(now);
    messagingRepository.save(receivedMessage);

    System.out.println(sb); <--- Prints response object to console
    return sb.toString();
}

【问题讨论】:

  • 你的意思是你有 JSON 对象,你必须读取与 JSON 中某些特定键(节点)相关的值吗?
  • @GauravJeswani 是的。特别是 'originationNumber' 和 'messageBody' 的值。这样我就可以保存这些值
  • 请在下面找到我的答案,提供 2 个解决方案。

标签: java arrays json database object


【解决方案1】:

您可以为此使用jackson 库。

解决方案1:您可以使用ObjectMapper,如下:

将 JSON 映射到 Java 对象的消息类:

public class Message {
 private String originationNumber;
 private String messageBody;

 // public getter and setters methods

}

从 JSON 字符串创建对象:

Message message = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
try {
   message = objectMapper.readValue(payload, Message.class);
} catch (JsonProcessingException e) {
   // Log Or do some action as per need
}

这里message 将具有这些值。 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 在这里用于跳过异常,因为 JSON 中还有其他字段,而 Java 类中不存在(因为我们不需要它们)。

解决方案 2:或者,您可以使用同一 Jackson 库中的 JsonNode 并逐个读取节点,如下所示:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"originationNumber\":\"***\",\"destinationNumber\":\"***\",\"messageKeyword\":\"KEYWORD_***\",\"messageBody\":\"Answer \",\"previousPublishedMessageId\":\"1slamq6mdpucd8q4i7iabf1sikc629ga253tr6o0\",\"inboundMessageId\":\"88bc02fc-aff3-4277-ac1d-f27b6d3b6abb\"}");

String originationNumber = actualObj.get("originationNumber");
String messageBody = actualObj.get("messageBody");

在这种方法中,您不需要创建Message 类。

【讨论】:

    【解决方案2】:

    可以将json字符串转换成json对象 https://www.javatpoint.com/how-to-convert-string-to-json-object-in-java

    String string = "{\"originationNumber\":\"***\",\"destinationNumber\":\"***\",\"messageKeyword\":\"KEYWORD_***\",\"messageBody\":\"Answer \",\"previousPublishedMessageId\":\"1slamq6mdpucd8q4i7iabf1sikc629ga253tr6o0\",\"inboundMessageId\":\"88bc02fc-aff3-4277-ac1d-f27b6d3b6abb\"}";  
    JSONObject json = new JSONObject(string);  
    System.out.println(json.toString());  
    String destinationNumber = json.getString("destinationNumber");  
    System.out.println(destinationNumber);
    

    【讨论】:

    • 这正是我想要的。谢谢 Sreyas
    • 不客气 :)
    【解决方案3】:

    你的 json 喜欢的地方

         {"originationNumber":"***",
        "destinationNumber":"***",
        "messageKeyword":"KEYWORD_***",
        "messageBody":"Answer","previousPublishedMessageId":"1slamq6mdpucd8q4i7iabf1sikc629ga253tr6o0",
        "inboundMessageId":"88bc02fc-aff3-4277-ac1d-f27b6d3b6abb"
        }
    

    喜欢

    "key":Value
    

    我认为你的代码会像

    receivedMessage.setUserId(userId);
    receivedMessage.setOriginationNumber("originationNumber");
    receivedMessage.setDestinationNumber("destinationNumber");
    receivedMessage.setMessageBody("messageBody");
    receivedMessage.setMessageType("RECEIVED");
    receivedMessage.setCreatedAt(now);
    messagingRepository.save(receivedMessage);
    

    【讨论】:

    • 是的,我明白了。但是我如何从 sb (对象的名称)中获取这些值以便我可以保存它们??
    • 这是一个 JSON 字符串,那么它将如何工作?这如何回答这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多