2012-01-11 4 views
1

存在しないとき、私はJSON以下の受信Strutsアクションを持っています。次のコードJSONObject要素が

{    
"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"); 
{    
    "commandId":"tC",  
    "id":"123", 
    "def":{"1":"aaa", "2":"bbb"} 
} 

はデフ空かないときは:場合DEFは、この例のように空にされていないデフ

これだけの作品は要素で定義され、このJSONオブジェクトを取得するために私のプログラムが行の上で動作しなくなることを定義しましたJSONObject def = command.getJSONObject("def");そして、それは実行を継続しないことに気づかれましたか?

私はJSONObject def = command.getJSONObject("def"); try/catchブロックを置く場合、私は_JSONObject [ "DEF"]を得るには、JSONObject _例外ではありませんが、実行は

どうJSONObject.getJsonObject(String)が振る舞うんか?継続しませんか

空のJSONObjectを返して実行を続けると思います。

に定義されているものがあるかどうかを確認してからを確認し、if、elseプログラムの中で見つかった値に応じて何をすべきかを決定します。クライアントのjsonがdefが空であるか、定義されていない場合、私のプログラムを動作させてください。

答えて

1

私の提案は、「DEF」のどちらかはnullとして定義するか、{}を定義することです値が文字列であることを示します。将来的にあなたと他の人が混乱するのを防ぐことができます。

0

あなたはこれを行うには.isNull(String key)を使用することができますorg.json.JSONObjectを使用している場合は、何かのように:オブジェクトを取得しようとする文字列を見つけることですので、それがある可能性が高い

if (command.isNull("def") { 
    // Handle 'def' not being there 
} else { 
    JSONObject def = command.getJSONObject("def"); 
} 
1

。あなたのJSON(あなたがそれを制御している場合)で、空のオブジェクトの場合、私は{}を実行します。これにより、Javaはオブジェクトを取得していると考えることができます。

1

defがオブジェクトであることを意図している場合は、空のときにこのように見えるとは思われません。

{    
"commandId":"tC",  
"id":"123", 
"def":{} 
} 

私はを有する値が文字列値ではなく、オブジェクトの値として解析することを試みたことが原因だと思います。 は「DEF」:nullまたは「DEF」:{}その使用許諾契約書と整合するように

引用符は本当にただのに使用され

1

多分、これは誰かを助けるでしょう。私は同じ問題を解決しなければならなかった。私の場合、要求されたレコードが見つからなかった場合、Webサービスは空の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"); 
をjavax.json使用しています。データ名は無実... 注2を保護するために変更されました