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"} ,但第二种情况是不可预测的,因为后面的空格数"\n

有没有办法将属性值中的这个错误处理为空对象???

4

3 回答 3

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 回答
1

您可以使用替换特定模式的正则表达式替换字符串

你可以在这里找到详细的

于 2013-11-12T11:32:04.750 回答