元素不存在时的JSONObject

时间:2012-01-11 15:25:18

标签: java json struts2

我有一个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 为空或未定义,请找到一种方法使我的程序正常工作。

5 个答案:

答案 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");
}