【问题标题】:Handle bad Json property values in Jackson处理 Jackson 中的错误 Json 属性值
【发布时间】:2013-11-12 11:25:40
【问题描述】:

我在我的 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之后的空格数

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

【问题讨论】:

    标签: java android parsing jackson


    【解决方案1】:

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

    详细可以找here

    【讨论】:

      【解决方案2】:

      您使用的是哪个版本的 Jackson?我已经使用版本 2.2.2 测试了我的解决方案。在这个版本中,您可以将构造函数添加到接受String 参数的Wiki 类。 您的 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;
      

      【讨论】:

        【解决方案3】:

        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;
        }
        

        【讨论】:

        • +1 ...你是对的。我做了同样的事情,除了开头的额外 \\s* "\"\\s*\\\\n\\s*\"" 。无论如何,非常感谢你,我会接受你的答案是正确的.
        猜你喜欢
        • 1970-01-01
        • 2018-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 2011-10-03
        • 2015-07-03
        相关资源
        最近更新 更多