example - jsonformat java
Extraño carácter ilegal de Jackson((CTRL-CHAR, código 0)) Excepción en el mapa Reducir Combinador (1)
Puede usar StringUtils de apache commons para escapar de la cadena: https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/src-html/org/apache/commons/lang/StringEscapeUtils.html#line.89
o puede reemplazar selectivamente los caracteres de control de la cadena antes de json marshaling.
También puede consultar esta publicación - Carácter ilegal - CTRL-CHAR
Tengo un trabajo Map-Reduce con un mapeador que toma un registro y lo convierte en un objeto, una instancia de MyObject, que se calcula a JSON usando Jackson. El valor es solo otro campo de texto en el registro.
La pieza relevante del mapeador es algo como lo siguiente:
ObjectMapper mapper = new ObjectMapper();
MyObject val = new MyObject();
val.setA(stringA);
val.setB(stringB);
Writer strWriter = new StringWriter();
mapper.writeValue(strWriter, val);
key.set(strWriter.toString());
Las salidas del asignador se envían a un Combinador que elimina el objeto JSON y agrega pares de clave-valor. Es conceptualmente muy simple y es algo como:
public void reduce(Text key, Iterable<IntWritable> values, Context cxt)
throws IOException, InterruptedException {
int count = 0;
TermIndex x = _mapper.readValue(key.toString(), MyObject.class);
for (IntWritable int : values) ++count;
...
emit (key, value)
}
La clase MyObject consta de dos campos (ambas cadenas), métodos get / set y un constructor predeterminado. Uno de los campos almacena fragmentos de texto basados en un rastreo web, pero siempre es una cadena.
public class MyObject {
private String A;
private String B;
public MyObject() {}
public String getA() {
return A;
}
public void setA(String A) {
this.A = A;
}
public String getB() {
return B;
}
public void setIdx(String B) {
this.B = B;
}
}
Parece que mi trabajo MapReduce se está ejecutando bien hasta que alcanza ciertos registros, a los que no puedo acceder fácilmente (porque el asignador está generando los registros de un rastreo), y se lanza la siguiente excepción:
Error: com.fasterxml.jackson.core.JsonParseException:
Illegal character ((CTRL-CHAR, code 0)): only regular white space (/r, /n, /t) is allowed between tokens
at [Source: java.io.StringReader@5ae2bee7; line: 1, column: 3]
¿Alguien tendría alguna sugerencia sobre la causa de esto?