【发布时间】:2020-06-25 03:03:17
【问题描述】:
我一直在尝试解析这个字符串以获取 Target-key
的值{
"Type" : "Notification",
"MessageId" : "something",
"Message" : "{\"buildId\":\"something\",\"somekey\":\"somevalue\",\"startTimeMillis\":1592526605121,\"table\":{\"key1\":\"val1\",\"tableName\":\"some table\",\"tableprop\":{\"bucketCount\":123,\"bucketColumns\":[\"X\",\"Y\"]},\"tableSortProperty\":{\"sortColumns\":[\"X\",\"Y\"]}},\"createStatementLocation\":{\"s3Bucket\":\"somebucket\",\"s3Prefix\":\"someprefix\"},\"Target-key\":\"Target-Value\"}",
"Timestamp" : "2020-06-19T19:23:46.378Z"
}
我尝试了以下方法:
message.getBody() 返回 Json 字符串。这里的 message 是 SQS Message 对象
方法一:
JSONObject jsonObject = new JSONObject(message.getBody());
JSONObject obj = (JSONObject) jsonObject.get("Message");
String res = (String)obj.get("Target-key");
我在上面代码的第 2 行收到错误
java.lang.String cannot be cast to org.json.JSONObject: java.lang.ClassCastException
java.lang.ClassCastException: java.lang.String cannot be cast to org.json.JSONObject
方法 2: 使用 Jackson 还会再次在 line2 上产生类转换异常。
Map<String,Map<String,String> > mymap;
mymap = objectMapper.readValue(message.getBody(), Map.class);
Map<String, String> mymap2 = mymap.get("Message");
String res = mymap2.get("Target-key");
方法 3: 也尝试使用杰克逊树节点
但是,下面的解决方案似乎确实有效,但我想知道为什么上面的方法失败了
Map<String,String> messageMap;
messageMap = objectMapper.readValue(message.getBody(), Map.class);
Map<String,String> mmap = objectMapper.readValue(messageMap.get("Message"), Map.class);
String res = mmap.get("Target-key");
PS:我已经尝试了许多关于堆栈溢出的替代方案和类似的问题,但这对我的情况没有帮助。
实际的key和value已经被some-key和some-value替换了。
编辑: 我偷偷进入源数据并更新了 JSON
【问题讨论】:
-
您的输入是否可能有引号?看起来您的原始输入可能不是您所期望的。
-
消息为 JSON {"key":"value"} 类型。消息是此大括号中的键之一。外部大括号不是括在 AWS SQS 控制台中的引号。我正在使用 message.getBody() ,其中消息是 SQS 定义的对象。它的返回类型是字符串。
-
你可能是对的。我偷偷进入源发现消息是这样的“消息”:“{\“buildId\”:\“B-2020.06.19.00.A........直到结束,封闭和分隔。这不是 JSON。任何线索。如何解析这个? @Deadron
-
更新了 JSON