1. ホーム
  2. java

JSON jsonObject.optString() は文字列 "null" を返す

2023-10-07 08:56:16

質問

サーバーとの通信にJSONを使用するAndroidアプリを開発しているのですが、jsonファイルをパースしようとすると変な問題が発生します。

これはサーバーからの私のjsonです

{
    "street2": null,
    "province": null,
    "street1": null,
    "postalCode": null,
    "country": null,
    "city": null
}

Cityの値を取得するために String city = address.optString("city", "") を呼び出しています。この状況で私が期待しているのは city が空であることを期待しているのですが(そのために optString がここにあるのですね)、実際には文字列 "null" が含まれています。そのため、さらに null- または isEmpty をチェックすると、String にテキストが含まれているため false が返されます。もし私が address.isNull("city") を呼び出すとtrueが返され、これは正しいのです。ただし optString は失敗します。

この問題については、Google や Stackoverflow で何も見つかりませんでした。私は思ったように、私は本当にそれが起こる可能性があることを理解していない optString は私が期待したとおりのことをすると思っていたので、どうしてこのようなことが起こるのか本当に理解できません。誰かここで何が間違っているのか知っていますか?

どのように解決するには?

この問題に遭遇して、quot; Could they really meant this?" と頭をかきむしるのは、あなただけではありません。 しました。 このバグを考慮する しかし、それらはバグ互換であっても、org.jsonの実装と互換性がなければなりませんでした。

考えてみれば、他の Java 環境で実行される同じライブラリを使用する同じコードが Android で異なる動作をする場合、サードパーティのライブラリを使用する際に大きな互換性の問題が発生するため、これは理にかなったことなのです。たとえ意図が善意であり、本当にバグを修正したとしても、まったく新しい事態を引き起こすことになります。

によると AOSP 問題 :

この動作は意図的なものです。私たちは org.json とバグ互換であるようにわざわざ努力しました。org.json が修正された今、私たちのコードも修正する必要があるかどうかは不明です。アプリケーションはこのバギーな動作に依存するようになったかもしれません。

もしこれがあなたを悲しませるのであれば、json.isNull()のようなnullをテストする別のメカニズムを使用することによって回避することをお勧めします。

ここに簡単な方法があります。

/** Return the value mapped by the given key, or {@code null} if not present or null. */
public static String optString(JSONObject json, String key)
{
    // http://code.google.com/p/android/issues/detail?id=13830
    if (json.isNull(key))
        return null;
    else
        return json.optString(key, null);
}