invar.lib.data.DataParserJson Maven / Gradle / Ivy
/*
* Copyright (c) 2016. Kang Wang. The following code is distributed under
* the terms of the MIT license found at http://opensource.org/licenses/MIT
*/
package invar.lib.data;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
/**
* Parse a data stream to a DataNode tree.
* Created by wangkang on 11/12/16
*/
public class DataParserJson implements DataParser {
private final JsonFactory factory;
public DataParserJson() {
this.factory = new JsonFactory();
}
public DataNode parse(String content) throws IOException {
DataNode root = DataNode.createObject();
if (content == null || content.length() <= 0) {
return root;
}
JsonParser parser = factory.createParser(content);
initParser(parser);
parse(parser, root);
parser.close();
return root.numChildren() > 0 ? root.getChild(0) : root;
}
public DataNode parse(InputStream input) throws IOException {
DataNode root = DataNode.createObject();
if (input == null || input.available() <= 0) {
return root;
}
JsonParser parser = factory.createParser(input);
initParser(parser);
parse(parser, root);
parser.close();
return root.numChildren() > 0 ? root.getChild(0) : root;
}
private void initParser(JsonParser parser) {
parser.enable(JsonParser.Feature.AUTO_CLOSE_SOURCE);
parser.enable(JsonParser.Feature.IGNORE_UNDEFINED);
parser.enable(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS);
}
private void parse(JsonParser parser, DataNode root) throws IOException {
String fieldName = null;
DataNode parent = root;
while (!parser.isClosed()) {
JsonToken token = parser.nextToken();
if (token == null) {
continue;
}
switch (token) {
case START_ARRAY:
parent.addChild(parent = DataNode.createArray().setFieldName(fieldName));
fieldName = null;
break;
case END_ARRAY:
parent = parent.getParent();
fieldName = null;
break;
case START_OBJECT:
parent.addChild(parent = DataNode.createObject().setFieldName(fieldName));
fieldName = null;
break;
case END_OBJECT:
parent = parent.getParent();
fieldName = null;
break;
case VALUE_TRUE:
parent.addChild(DataNode.createBoolean()
.setValue(true).setFieldName(fieldName));
fieldName = null;
break;
case VALUE_FALSE:
parent.addChild(DataNode.createBoolean()
.setValue(false).setFieldName(fieldName));
fieldName = null;
break;
case VALUE_NULL:
parent.addChild(DataNode.createNull()
.setValue(null).setFieldName(fieldName));
fieldName = null;
break;
case VALUE_STRING:
parent.addChild(DataNode.createString().setFieldName(fieldName)
.setValue(parser.getValueAsString()));
fieldName = null;
break;
case VALUE_NUMBER_INT:
try {
Long v = parser.getValueAsLong();
parent.addChild(DataNode.createLong()
.setFieldName(fieldName).setValue(v));
} catch (JsonParseException e) {
BigInteger v = parser.getBigIntegerValue();
parent.addChild(DataNode.createBigInt()
.setFieldName(fieldName).setValue(v));
}
fieldName = null;
break;
case VALUE_NUMBER_FLOAT:
parent.addChild(DataNode.createDouble().setFieldName(fieldName)
.setValue(parser.getValueAsDouble()));
fieldName = null;
break;
case FIELD_NAME:
fieldName = parser.getValueAsString();
break;
default:
fieldName = null;
break;
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy