3

JSON の「null」プロパティを解析しようとしたときに 1 つの問題に直面しました。本当の問題を理解するのを手伝ってください。次のJSONがありました:

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

http://jsonlint.comを使用して、この JSON が有効であることを検証しました。私はJavaからそれを解析しようとしました:

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);
    }
}

しかし、例外があります:

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)

http://json-lib.sourceforge.netの json-lib-2.4-jdk15.jar を使用して解析しました。誰でもこれを明確にしてもらえますか? このライブラリが例外をスローするのに、オンライン バリデーターが有効な JSON であると言ったのはなぜですか? それはライブラリのバグですか、それとも何か間違っていますか?

4

4 に答える 4

3

JSON-lib は、最初に Java マップを解析し、入力 JSON を入力します。残念ながら、JSON-lib はすべての JSON オブジェクト要素名が JSON かどうかをチェックしますnull。メソッドでnullチェックを行いJSONNull.equals(Object)ます。nullこのメソッドは、実際には JSON値ではない「null」JSON 文字列に対して true を返します。

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

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

より迅速な解決策として利用できるオプションには、JSON-lib コードを自分で変更するか、ライブラリを切り替えることが含まれます。

ライブラリを切り替えることができる場合は、ジャクソンを強くお勧めします。以下は、元の質問の例の 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}
于 2011-07-15T01:35:03.890 に答える
2

投稿された最初の JSON は有効な JSON です。ただし、Java の JSON は有効ではありません"。[必須] キー クォートに対してのみ有効です。json.orgから:

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

ただし、それはバグのように聞こえますが、無効なJSONが供給されたためにトリガーされなかったと仮定すると(ライブラリは無効なJSONで必要なことを何でも実行できます)...ソース(またはバグレポート/ユーザーエクスペリエンス)を確認する必要があります)これが本当に「バグ」であるかどうかを最終的に言うために。予想される動作を示すか、原因/問題の概要をさらに詳しく説明する可能性のある、いくつかの提案を以下に追加しました。

この最小限のテストケースを考えてみましょう (有効な JSON を使用):

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

これは、最初のアイテムが抽出された"null"かどうかに応じて、より多くの光を当てることもできます。null

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

ハッピーコーディング。

于 2011-07-14T00:35:23.920 に答える
0

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

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

私は通常、josn文字列を生成するためにgsonを使用しているので、gsonでjson文字列を解析するためにstackoverflowに投稿された他の誰かの例を見つけました。リンクを参照してください。

JSON から Java への変換

于 2012-03-02T02:02:05.007 に答える
-1

Gsonを使用することをお勧めします。

Java Map と List を使用して json 文字列を作成し、Gson を使用して Map または List オブジェクトを出力します。

于 2011-07-14T01:38:20.210 に答える