Open
Description
Currently jackson supports reading newline-delimited json such as JSON Lines and NDJSON, see FasterXML/jackson-databind#1304.
There is a proposed standard RFC7464 call JSON Text Sequences, it's similar to newline-delimited json by add a leading RS CTRL-CHAR which is not accepted by jackson.
com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 30)): only regular white space (\r, \n, \t) is allowed between tokens
at [Source: (String)"�{"name":"name1"}
�{"name":"name2"}
"; line: 1, column: 2]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1851)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:707)
at com.fasterxml.jackson.core.base.ParserMinimalBase._throwInvalidSpace(ParserMinimalBase.java:685)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._skipWSOrEnd(ReaderBasedJsonParser.java:2397)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:672)
at com.fasterxml.jackson.databind.ObjectReader.readValues(ObjectReader.java:1898)
It would be nice if jackson simply treat RS as "\t" be default or JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS
enabled.
here is test case:
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JSONTextSequencesTest {
@Test
public void test() throws Exception {
String json = "\u001E{\"name\":\"name1\"}\n\u001E{\"name\":\"name2\"}\n";
ObjectMapper om = new ObjectMapper();
MappingIterator<JsonNode> it = om.readerFor(JsonNode.class).readValues(json);
List<String> names = new ArrayList<>();
while (it.hasNext())
names.add(it.next().get("name").asText());
assertEquals(2, names.size());
assertEquals("name1", names.get(0));
assertEquals("name2", names.get(1));
}
}