13

投稿する前に Stack Overflow を検索しましたが、Jackson の解決策はありませんでした。

サーバーの応答は次のとおりです。

{
  "ok": true,
  "result": [
    {
      "update_id": 489881731,
      //rest 
    },
    {
      "update_id": 489881732,
      //rest
    }
  ]
}

ご覧のとおり、プロパティ"result"は配列です。

これは別の応答です。

{
  "ok": true,
  "result": {
    "id": 211948704,
    "first_name": "ربات ادمین‌های تلگرام",
    "username": "tgAdminsBot"
  }
}

ここ"result"に単一のオブジェクトがあります。

これは、コンテンツをデシリアライズしたい私のクラスです。もちろん、カスタムデシリアライザーを作成しましたTObject

public class Result
{
    private TObject[] result;
    private boolean ok;

    public void setOk (boolean ok) {//code}

    public void setResult (TObject[] result) {//code}


    public TObject[] getResult () {//code}

    public boolean getOk (){//code}
}

だから私は自分のクラスで "result"が s の配列であると仮定しましたTObject。今、私は何ができますか? 1つは s の配列であり、もう 1 つは単一のOKである 2 つのフィールドを使用@JsonProperty("result")TObjectTObject

していますか? そうでない場合、他に何ができますか?

4

1 に答える 1

17

DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY両方有効にすると

{"result": []}

{"result": {}}として解析できます

class Result{
   List result;
}

ドキュメント リンク

Java コレクション (配列、java.util.Collection) 型で動作するように非配列 (JSON) 値を強制することが許容されるかどうかを決定する機能。有効にすると、コレクション デシリアライザーは、JSON 配列を囲む "暗黙の" ものがあるかのように、配列以外の値を処理しようとします。この機能は、配列内の要素が 1 つだけの場合に JSON 配列を除外するパッケージ (XML から JSON へのコンバーターなど) を操作するために、互換性/相互運用性の理由で使用することを意図しています。この機能はデフォルトで無効になっています。

OP 入力 json および POJO での使用方法のデモ:

ObjectMapper mapper = new ObjectMapper()
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
Result result = mapper.readValue(Result.class;

@JsonFormat何らかの理由でマッパーのバージョンが気に入らない場合は、上記のクラスまたはフィールドで使用できます

@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

PS。この問題に関するその他の SO の質問: LINK

于 2016-05-12T00:51:09.613 に答える