2

Android プロジェクトで Jackson ライブラリを使用しています

クラスがあります

@JsonIgnoreProperties(ignoreUnknown = true)
public class SomeResponse{

@JsonPropery("wiki")
Wiki wiki;
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class Wiki{
@JsonProperty("title")
String title;
@JsonProperty("description")
String description;
}

コードを解析する

String resultFromServer = ....;
ObjectMapper mapper = new ObjectMapper();
        mapper.enable(
                Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

Wiki str= mapper.readValue(resultFromServer,Wiki.class);

今、このコードは問題なく動作し、応答が次のように返されることがあります

{wiki:"\n          "}

そして時折

{wiki:"\n"}

したがって、解析は失敗します。私がすることができます

 String resultFromServer = ....; 
if (resultFromServer != null && resultFromServer.contains("\"\\\\n\"")) {
            resultFromServer = resultFromServer.replaceAll("\"\\\\n\"", "\"\"");
        }

現在、このコードはこのケースを処理します {wiki:"\n"} が、2 番目のケースは予測できません。"\n

プロパティ値でこのエラーを処理してnullオブジェクトにする方法はありますか???

4

3 に答える 3

1

特定のパターンを置き換える正規表現を使用して文字列を置き換えることができます

こちらで詳しくご覧いただけます

于 2013-11-12T11:32:04.750 に答える
1

String.replaceAll正規表現を使用すると、それを使用して任意の数のスペースに一致させることが簡単にできます。

resultFromServer.replaceAll("\"\\s*\\\\n\\s*\"", "\"\"");

\sスペースのサインです)。また、containsテストは必ずしも必要ではありませんが、保持したい場合は、スペースをテストするために正規表現の一致に置き換える必要があります。

カスタム indexof メソッドを使用した文字列の正規表現一致

/**
 * contains with regex
 * 
 * @param pattern
 * @param s
 * @return
 */
public static boolean contains(Pattern pattern, String s) {
    return indexOf(pattern, s) > -1;
}

/**
 * indexOf with regex

 * 
 * @param pattern
 * @param s
 * @return
 */
public static int indexOf(Pattern pattern, String s) {
    Matcher matcher = pattern.matcher(s);
    return matcher.find() ? matcher.start() : -1;
}
于 2013-11-12T15:23:47.323 に答える
1

ジャクソンのどのバージョンを使用していますか? バージョン 2.2.2 を使用してソリューションをテストしました。このバージョンでは、パラメーターWikiを受け入れるクラスにコンストラクターを追加できStringます。POJO クラスは次のようになります。

@JsonIgnoreProperties(ignoreUnknown = true)
class Wiki {

    public Wiki() {
    }

    public Wiki(String title) {
        this.title = title;
    }

    @JsonProperty("title")
    private String title;

    @JsonProperty("description")
    private String description;

    // getters, setters, toString
}

使用例:

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

SomeResponse response = mapper.readValue(json, SomeResponse.class);
System.out.println(response);

奇妙な内容のオブジェクトを作成したくない場合は、Wikiクラスのカスタム デシリアライザーを作成することもできます。

class WikiJsonDeserializer extends JsonDeserializer<Wiki> {

    @Override
    public Wiki deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonToken token = jp.getCurrentToken();
        if (JsonToken.VALUE_STRING == token) {
            return null;
        }

        return jp.readValueAs(Wiki.class);
    }
}

次の方法でデシリアライザーを指定できます。

@JsonDeserialize(using = WikiJsonDeserializer.class)
@JsonProperty("wiki")
private Wiki wiki;
于 2013-11-12T15:18:13.783 に答える