我有一个struts动作接收以下JSON:
{
"commandId":"tC",
"id":"123",
"def":""
}
以下代码工作正常:
JSONObject command = null;
String commandId = null;
String deviceId = null;
try {
command = new JSONObject(json);
commandId = command.getString("commandId");
}
由于“def”可以为空,非声明或可以包含我尝试这样做的另一个元素数组:
JSONObject def = command.getJSONObject("def");
为了获得元素 def
中定义的JSON对象这仅在 def 不为空时才有效,如下例所示:
{
"commandId":"tC",
"id":"123",
"def":{"1":"aaa", "2":"bbb"}
}
当 def 为空或未定义时,我的程序停止在JSONObject def = command.getJSONObject("def");
行上工作并注意到它没有继续执行?!
如果我把JSONObject def = command.getJSONObject("def");
try / catch块我得到_JSONObject [“def”]不是JSONObject _异常,但是执行没有继续
JSONObject.getJsonObject(String)
的行为如何?
我希望它返回一个空的JSONObject并继续执行。
我想要的是检查 def 中是否有任何定义,然后在if中,否则根据在那里找到的值决定在我的程序中做什么...我不能如果客户端的json附带 def 为空或未定义,请找到一种方法使我的程序正常工作。
答案 0 :(得分:1)
可能是因为它试图获取一个Object并找到一个字符串。在你的JSON中(如果你控制它),对于一个空对象,我会做{}
。这应该允许Java认为它正在检索对象。
答案 1 :(得分:1)
如果def
打算成为一个对象,那么在空的时候它不应该是这样的吗?
{
"commandId":"tC",
"id":"123",
"def":{}
}
我认为使用"def":""
会导致尝试将值解析为字符串值而不是对象值。
答案 2 :(得分:1)
我的建议是将“def”定义为null或{}: “def”:null或“def”:{}与其使用协议一致
引号实际上只是用来表示值是一个字符串。遵循该标准可能会使您和其他人在将来免于混淆。
答案 3 :(得分:1)
也许这会对某人有所帮助。我不得不解决同样的问题。在我的情况下,如果Web服务无法找到所请求的记录,则它返回空JSON对象。
注意:数据名称已被更改以保护无辜...... 注2:此示例使用javax.json
import javax.json.*;
JsonObject _jObj = _myRootObj.getJsonObject("someDataNode");
// at this point in execution _jObj could equal {"DataReturn":""}
// or {"DataReturn":"<some valid data>"}
// we want to test the existence of DataReturn before trying to
// use it
JsonValue jv = _jObj.getOrDefault("DataReturn", null);
String js = jv.toString();
// cover all the bases. test the value
if (js == null || js.isEmpty() || js.compareTo("\"\"") == 0)
{
throw new Exception("Error: DataReturn object null. Cannot proceed.");
}
// the object exists, so it's ok to get it
JsonObject jObjDate = _jObj.getJsonObject("DataReturn");
答案 4 :(得分:0)
如果您使用org.json.JSONObject
,可以使用.isNull(String key)
执行此操作,例如:
if (command.isNull("def") {
// Handle 'def' not being there
} else {
JSONObject def = command.getJSONObject("def");
}