0

POJOをjson文字列にシリアライズする方法に取り組んでいます。jackson ライブラリを使用していますが、問題が発生しました。

json オブジェクトの値は、文字列または文字列配列のいずれかにすることができます...

{"mimeTypes":"all"}

また

 {"mimeTypes":["application/pdf", "application/msword"]}

これが現時点での私のアプローチです

@JsonIgnore
private String mimeTypes;
@JsonIgnore
private String[] mimeTypesArray;
@JsonRawValue
@JsonProperty("integration/enabled-mime-types")
private String mimeType;

public void setMimeTypes(String mimeTypes) {
    this.mimeTypes = mimeTypes;
    mimeType = mimeTypes;
}

public void setMimeTypes(String[] mimeTypes) {
    this.mimeTypesArray = mimeTypes;
    try {
        JSONArray jsonArray = new JSONArray(mimeTypes);
        this.mimeType = jsonArray.toString();
    } catch (JSONException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
}

基本的に、文字列用のフィールド、文字列配列用のフィールド、および json オブジェクトに追加する文字列用のフィールドがあります。オブジェクトマッパーが使用するフィールドを選択する必要がないように、セッターでシリアル化します。

これはハッキーなやり方のように感じます。より良い解決策はありますか?ジャクソンビューの使用について読んでいますが、これが私の問題で可能かどうかはわかりません。

4

1 に答える 1

1

私はそれをテストしていませんが、シリアル化する必要があるものを計算するための専用のメソッドを追加してみます。

class MyMimeTypes {
    @JsonIgnore
    private String[] mimeTypesArray;

    /** A convenience method for setting just one item. */
    public void setMimeType(String mimeType) {
        this.mimeTypesArray = new String[] { mimeType };
    }

    public void setMimeTypes(String[] mimeTypes) {
        this.mimeTypesArray = mimeTypes;
    }

    // The JSON-specific part:

    @JsonProperty("mimeTypes")
    public Object jsonMimeTypes() {
        if (mimeTypesArray.length == 1)
            return mimeTypesArray[0];
        else
            return mimeTypesArray;
    }
}

このように、配列にアイテムが1つしかない場合、シリアル化された値はアイテムだけになります。それ以外の場合は、アレイ全体がシリアル化されます。

同じ名前で異なる署名を持つ2つのセッターを使用することは悪い習慣であることに注意してください。JavaBeans仕様に違反するAFAIK。

おそらく、ここでvarargメソッドを使用して2つのセッターを置き換えることができます(ただし、これがJava Beans仕様とどのように連携するかはわかりません)。

public void setMimeTypes(String... mimeTypes) {
    this.mimeTypesArray = mimeTypes;
}
于 2012-08-08T13:55:18.553 に答える