Skip to content

Skip RS CTRL-CHAR to support JSON Text Sequences #633

Open
@quaff

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

}

Metadata

Assignees

No one assigned

    Labels

    2.16Issue planned (at earliest) for 2.16good first issueIssue that seems easy to resolve and is likely a good candidate for contributors new to project

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions