2011-07-14 7 views
3

JSON "null"プロパティを解析しようとすると1つの問題に直面しました。本当の問題が何かを理解するのを助けてください。JSONプロパティ "null"を解析できません

{ 
    "properties" : {   
    "null" : { 
     "value" : false 
    } 
    } 
} 

私はこのJSONが有効であることを検証するためにhttp://jsonlint.comを使用:私は、次のJSONを持っていました。

import net.sf.json.JSONObject; 
import java.io.IOException; 

public class Test { 
    public static void main(String[] args) throws IOException { 
     String st = "{" + 
       "  'properties' : {" + 
       "  'null' : {" + 
       "   'value' : false" + 
       "  }" + 
       "  }" + 
       "}"; 
     JSONObject.fromObject(st); 
    } 
} 

しかし例外ました:私はJavaからそれを解析しようとした私はそれを解析する http://json-lib.sourceforge.netからJSON-libの-2.4-jdk15.jarを使用

Exception in thread "main" java.lang.ClassCastException: JSON keys must be strings. 
    at net.sf.json.JSONObject._fromJSONObject(JSONObject.java:927) 
    at net.sf.json.JSONObject.fromObject(JSONObject.java:155) 
    at net.sf.json.JSONSerializer.toJSON(JSONSerializer.java:108) 
    at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:238) 
    at net.sf.json.JSONObject._processValue(JSONObject.java:2655) 
    at net.sf.json.JSONObject.processValue(JSONObject.java:2721) 
    at net.sf.json.JSONObject.element(JSONObject.java:1786) 
    at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:1036) 
    at net.sf.json.JSONObject._fromString(JSONObject.java:1201) 
    at net.sf.json.JSONObject.fromObject(JSONObject.java:165) 
    at net.sf.json.JSONObject.fromObject(JSONObject.java:134) 

を。誰もこれを明確にしてもらえますか?なぜこのライブラリは例外をスローしますが、オンラインバリデータはそれが有効なJSONだと言っていますか?それは図書館のバグですか、何か間違ったことをしましたか?

+0

これが問題の原因ではありませんが、 'null'なのではJavaScriptでキーワードです。あなたは本当にあなたの財産の名前としてそれを使用する必要がありますか? – aroth

+0

@aroth 1)JSONはJavaScriptではありません。オブジェクトリテラルを二重引用符で囲む必要があるJavaScriptリテラルの形式化されたサブセットです2) 'null 'は' null'ではありません –

+0

@pst - JSONはJavaScriptを使用していますが、多くの場合、JavaScriptで作業することになります(JavaScriptでは機能しませんが、いくつかの[混乱しやすいコード](http://jsfiddle.net/SZSm6/)になります)。また、 'null'もJavaのキーワードです。 「ヌル」が「ヌル」でないことは重要ではない。私の意見では、まだ "" null "というプロパティを呼び出すのは意味的に曖昧です。 – aroth

答えて

2

投稿された最初のJSONは有効なJSONですが、JavaのJSONは無効です。[必須]キーの引用には"のみ有効です。 json.orgから:

文字列はバックスラッシュをエスケープ使用して、二重引用符に包まれたゼロ以上のUnicode文字のシーケンス、です....

しかし、それはのように聞こえますと仮定して無効にされた JSONがフィードされました(ライブラリは無効なJSONで何でもできます)。ソース(またはバグレポート/ユーザーエクスペリエンス)が最終的に「バグ」かどうかを確認します。以下で試してみるべきことのいくつかの提案を追加しました。これは、予想される動作を示すか、原因/問題の概要を詳細に示します。

(有効JSONと)、この最小のテストケースを考えてみる:

String st = "{ \"null\": \"hello world!\" }"; 

これはまた、抽出されたときに最初の項目は"null"又はnullある場合に応じて、より多くの光を当てることができる:

String st = "[ \"null\" ]"; 

ハッピーコーディング。

-1

その後、地図やListオブジェクト

+1

GSONへのリンクを追加する必要があります。理想的には、例のコードスニペットを投稿するか、記述したアプローチの例にリンクしてください。 –

+0

ok、私はここの新しい人です。答えは少しシンプルかもしれません。私は別の答えを投稿します –

3

JSON-libには、最初にJavaの地図を解析し、移入出力にGsonを使用し、あなたはGsonを使用することをお勧め

とJavaの地図やリストを使用してJSON文字列を構築し、 入力JSONを使用します。残念なことに、JSON-libはすべてのJSONオブジェクト要素名がJSON nullかどうかをチェックします。 nullのチェックはJSONNull.equals(Object)メソッドで実行されます。このメソッドは、実際にはJSON nullという値ではない "null" JSON文字列に対してtrueを返します。

この問題については、JSON-libプロジェクトにバグを提出することをお勧めします。 JSONNull.equals(Object)の実装に欠陥があります。

残念ながら、これをカスタムPropertyNameProcessorで処理することはできません。

より直接的な解決策として、JSON-libコードを自分で変更する方法や、ライブラリを切り替える方法などがあります。

ライブラリを切り替えることができる場合は、Jacksonを強くお勧めします。以下は、元の質問の例JSONを逆シリアル化するための例です。

/* 
{ 
    "properties" : {   
    "null" : { 
     "value" : false 
    } 
    } 
} 
*/ 
String json = "{\"properties\":{\"null\":{\"value\":false}}}"; 

ObjectMapper mapper = new ObjectMapper(); 
Map<String, Object> map = mapper.readValue(json, Map.class); 
System.out.println(map); 
// output: {properties={null={value=false}}} 

Map<String, Object> propertiesMap = (Map) map.get("properties"); 
System.out.println(propertiesMap); 
// output: {null={value=false}} 

Map<String, Object> nullMap = (Map) propertiesMap.get("null"); 
System.out.println(nullMap); 
// output: {value=false} 
0

gsonライブラリのリンクは次のとおりです。

http://code.google.com/p/google-gson/

I josn文字列を生成するために、通常USR gsonので、私は他のいくつかの例の誰かが見る、gsonでJSON文字列を解析するためのstackoverflowに掲載見つかりましたリンク:

Converting JSON to Java

関連する問題