/src/test/java/com/alibaba/json/test/performance/JacksonGroupParser.java
https://github.com/alibaba/fastjson · Java · 301 lines · 246 code · 55 blank · 0 comment · 119 complexity · 08bc62cc3f91b8e515620df5d5206096 MD5 · raw file
- package com.alibaba.json.test.performance;
-
- import java.io.IOException;
- import java.math.BigDecimal;
- import java.util.Date;
- import java.util.List;
-
- import com.alibaba.fastjson.JSONException;
- import com.alibaba.json.test.entity.Company;
- import com.alibaba.json.test.entity.Department;
- import com.alibaba.json.test.entity.Employee;
- import com.alibaba.json.test.entity.Group;
- import com.fasterxml.jackson.core.JsonLocation;
- import com.fasterxml.jackson.core.JsonParseException;
- import com.fasterxml.jackson.core.JsonParser;
- import com.fasterxml.jackson.core.JsonToken;
-
- public class JacksonGroupParser {
-
- private JsonParser parser;
-
- public JacksonGroupParser(JsonParser parser) throws Exception{
- this.parser = parser;
- parser.nextToken(); // move to the start of the
- }
-
- public Group parseGroup() throws Exception {
- Group group = new Group();
-
- accept(JsonToken.START_OBJECT);
-
- for (;;) {
- JsonToken tok = parser.getCurrentToken();
-
- if (tok == JsonToken.END_OBJECT) {
- break;
- }
-
- if (tok == JsonToken.FIELD_NAME) {
- String name = parser.getCurrentName();
- tok = parser.nextToken();
-
- if ("name" == name) {
- group.setName(acceptString(tok));
- } else if ("description" == name) {
- group.setDescription(acceptString(tok));
- } else if ("companies" == name) {
- parseCompany(group.getCompanies());
- } else {
- throw new RuntimeException("not match property : " + name);
- }
- }
- }
-
- accept(JsonToken.END_OBJECT);
-
- return group;
- }
-
- private Company parseCompany() throws Exception {
- Company company = new Company();
-
- accept(JsonToken.START_OBJECT);
-
- for (;;) {
- JsonToken tok = parser.getCurrentToken();
-
- if (tok == JsonToken.END_OBJECT) {
- break;
- }
-
- if (tok == JsonToken.FIELD_NAME) {
- String name = parser.getCurrentName();
- tok = parser.nextToken();
-
- if ("name" == name) {
- company.setName(acceptString(tok));
- } else if ("description" == name) {
- company.setDescription(acceptString(tok));
- } else if ("stock" == name) {
- company.setStock(acceptString(tok));
- } else if ("id" == name) {
- company.setId(acceptLong(tok));
- } else if ("rootDepartment" == name) {
- company.setRootDepartment(parseDepartment());
- } else {
- throw new RuntimeException("not match property : " + name);
- }
- }
- }
-
- accept(JsonToken.END_OBJECT);
-
- return company;
- }
-
- private Department parseDepartment() throws Exception {
- accept(JsonToken.START_OBJECT);
-
- Department company = new Department();
-
- for (;;) {
- JsonToken tok = parser.getCurrentToken();
-
- if (tok == JsonToken.END_OBJECT) {
- break;
- }
-
- if (tok == JsonToken.FIELD_NAME) {
- String name = parser.getCurrentName();
- tok = parser.nextToken();
-
- if ("name" == name) {
- company.setName(acceptString(tok));
- } else if ("description" == name) {
- company.setDescription(acceptString(tok));
- } else if ("id" == name) {
- company.setId(acceptLong(tok));
- } else if ("children" == name) {
- parseDepartment(company.getChildren());
- } else if ("members" == name) {
- parseEmployee(company.getMembers());
- } else {
- throw new RuntimeException("not match property : " + name);
- }
- }
- }
-
- accept(JsonToken.END_OBJECT);
-
- return company;
- }
-
- private Employee parseEmployee() throws Exception {
- accept(JsonToken.START_OBJECT);
-
- Employee emp = new Employee();
-
- for (;;) {
- JsonToken tok = parser.getCurrentToken();
-
- if (tok == JsonToken.END_OBJECT) {
- break;
- }
-
- if (tok == JsonToken.FIELD_NAME) {
- String name = parser.getCurrentName();
- tok = parser.nextToken();
-
- if ("name" == name) {
- emp.setName(acceptString(tok));
- } else if ("description" == name) {
- emp.setDescription(acceptString(tok));
- } else if ("number" == name) {
- emp.setNumber(acceptString(tok));
- } else if ("id" == name) {
- emp.setId(acceptLong(tok));
- } else if ("age" == name) {
- emp.setAge(acceptInteger(tok));
- } else if ("salary" == name) {
- emp.setSalary(acceptBigDecimal(tok));
- } else if ("birthdate" == name) {
- emp.setBirthdate(new Date(acceptLong(tok)));
- } else if ("badboy" == name) {
- emp.setBadboy(acceptBoolean(tok));
- } else {
- throw new RuntimeException("not match property : " + name);
- }
- }
- }
-
- accept(JsonToken.END_OBJECT);
-
- return emp;
- }
-
- private void parseEmployee(List<Employee> list) throws Exception {
- accept(JsonToken.START_ARRAY);
- for (;;) {
- JsonToken tok = parser.getCurrentToken();
-
- if (tok == JsonToken.END_ARRAY) {
- break;
- }
-
- list.add(parseEmployee());
- }
- accept(JsonToken.END_ARRAY);
- }
-
- private void parseDepartment(List<Department> list) throws Exception {
- accept(JsonToken.START_ARRAY);
- for (;;) {
- JsonToken tok = parser.getCurrentToken();
-
- if (tok == JsonToken.END_ARRAY) {
- break;
- }
-
- list.add(parseDepartment());
- }
- accept(JsonToken.END_ARRAY);
- }
-
- private void parseCompany(List<Company> list) throws Exception {
- accept(JsonToken.START_ARRAY);
- for (;;) {
- JsonToken tok = parser.getCurrentToken();
-
- if (tok == JsonToken.END_ARRAY) {
- break;
- }
-
- list.add(parseCompany());
- }
- accept(JsonToken.END_ARRAY);
- }
-
- private String acceptString() throws Exception {
- if (parser.getCurrentToken() == JsonToken.VALUE_STRING) {
- String stringValue = parser.getText();
- parser.nextToken();
- return stringValue;
- } else {
- throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
- }
- }
-
- private String acceptString(JsonToken token) throws Exception {
- if (token == JsonToken.VALUE_STRING) {
- String stringValue = parser.getText();
- parser.nextToken();
- return stringValue;
- } else {
- throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
- }
- }
-
- private Long acceptLong(JsonToken token) throws Exception {
- if (token == JsonToken.VALUE_NUMBER_INT) {
- long value = parser.getLongValue();
- parser.nextToken();
- return value;
- } else {
- throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
- }
- }
-
- private boolean acceptBoolean(JsonToken token) throws Exception {
- if (token == JsonToken.VALUE_TRUE) {
- parser.nextToken();
- return true;
- } else if (token == JsonToken.VALUE_FALSE) {
- parser.nextToken();
- return false;
- } else {
- throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
- }
- }
-
- private BigDecimal acceptBigDecimal(JsonToken token) throws Exception {
- if (token == JsonToken.VALUE_NUMBER_FLOAT) {
- BigDecimal value = parser.getDecimalValue();
- parser.nextToken();
- return value;
- } else {
- throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
- }
- }
-
- private Integer acceptInteger(JsonToken token) throws Exception {
- if (token == JsonToken.VALUE_NUMBER_INT) {
- int value = parser.getIntValue();
- parser.nextToken();
- return value;
- } else {
- throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
- }
- }
-
- private void accept(JsonToken token) throws Exception {
- if (parser.getCurrentToken() == token) {
- parser.nextToken();
- } else {
- throw new JSONException("syntax error, expect " + token + ", actual " + parser.getCurrentToken());
- }
- }
-
- public static String getNextTextValue(String fieldName, JsonParser parser) throws JsonParseException, IOException {
- JsonToken current = parser.nextToken(); // move to filed
- if (current != JsonToken.FIELD_NAME || !fieldName.equals(parser.getCurrentName())) {
- reportParseError("Error occoured while getting value by field name:" + fieldName, parser.getCurrentLocation());
- }
- current = parser.nextToken(); // move to value
- return parser.getText();
- }
-
- public static void reportParseError(String errorMsg, JsonLocation jsonLoc) throws JsonParseException {
- throw new JsonParseException(errorMsg, jsonLoc);
- }
- }