0

JSON タグを解析するために GSON ライブラリを使用しています。

一部のタグは、文字列値 (配列ではありません) を保持する必要があります。問題は、要素が空 [] の場合があり、その場合、コンソールにこのエラーが表示されることです

expected String but was BEGIIN ARRAY.

以下は、私の JSON の理想的なケースです。

   {
     "internet": "600.00",
    "internet_remarks": "Fibre 1gbps",
    }

しかし、時々それは

        {
        "internet": "600.00",
        "internet_remarks": [],
        }

私の解析コードは次のとおりです。

GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
MainContainer mainContainer = gson.fromJson(obj, MainContainer.class);    

私のクラスでは次のようになっていますが、ヴァライユは次のように定義されています

private String internet;
private String internet_remarks;

私の質問は、変数が空の配列に対応するためにどのような変更を加える必要があるかです []

4

3 に答える 3

4

(設計が不十分な) JSON のソースを制御できず、修正できない場合は、MainContainerオブジェクトを構築するカスタム デシリアライザーを作成する必要があります。

参照:カスタム デシリアライザーを作成するにはどうすればよいですか? ここSOおよび/またはGsonユーザーガイドの情報

そのフィールドが配列型であるのが空の配列である場合だけである場合、私が考えることができる最も簡単な方法は、返された JSON を調べて、それが配列である場合は削除することです。次に、にデシリアライズしますMainContainer。Gson は、JSON で欠落している要素を黙って無視internet_remarksnullMainContainer.

class MyDeserialier implements JsonDeserializer<MainContainer>
{
    @Override
    public MainContainer deserialize(JsonElement je, Type type, 
                                     JsonDeserializationContext jdc) 
                                      throws JsonParseException
    {
        JsonObject obj = je.getAsJsonObject();
        if (obj.get("internet_remarks").isJsonArray())
        {
            obj.remove("internet_remarks");
        }

        return new Gson().fromJson(obj, MainContainer.class):
    }
}

実際にはそうではなく、その配列が空でない可能性がある場合は、それを処理するロジックを追加し、それStringが本当に必要な場合に変換する必要があります。

于 2013-06-22T18:02:58.853 に答える
0

あなたの場合:

配列を文字列に解析するように要求すると、gson パーサーは混乱します。

したがって、internet_remarks を文字列の配列に変更できます。

コンテナー クラスで注釈を使用するのは、常に安全な方法です。

エクストラ:

json を扱うときはいつでも、これらの 2 つのツールが便利です。

1.OnlineJsonEditor

2.JsonGen _

于 2013-06-21T04:22:53.387 に答える
0

2 番目の属性を配列として宣言することをお勧めします。すなわち

private String[] internet_remarks;

単一の文字列がある場合でも、それを配列に入れます。例えば:

{
     "internet": "600.00",
     "internet_remarks": ["Fibre 1gbps"]
    }

空いている時は、

 {
     "internet": "600.00",
     "internet_remarks": []
    }

だからあなたのjson意志は常に一貫しています。

また、実際にはGsonBuilder. Gsonビルダーよりもコンストラクターを使用してインスタンスを作成できます。

Gson gson = new Gson();
于 2013-06-21T04:55:15.347 に答える