2013-11-12 3 views
1

Я использую библиотеку Джексона в моем андроида проектаHandle плохих значений свойств JSon в Джексон

У меня есть класс

@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

есть способ справиться с этой ошибкой в ​​значениях свойств быть нулевым объектом ???

ответ

1

Вы можете заменить строки с помощью регулярных выражений, который заменяет определенные шаблоны

Вы можете найти в деталях here

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; 
+0

это помогло мне в другом случае спасибо тонны. – user4o01

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

+1 ... Вы правы. Я сделал то же самое, за исключением дополнительных \\ s * в начале «\» \\ s * \\\\ n \\ s * \ "". Любым способом спасибо вам большое, я буду принимать ваш ответ как правильный , – user4o01

Смежные вопросы