/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

  1. package com.alibaba.json.test.performance;
  2. import java.io.IOException;
  3. import java.math.BigDecimal;
  4. import java.util.Date;
  5. import java.util.List;
  6. import com.alibaba.fastjson.JSONException;
  7. import com.alibaba.json.test.entity.Company;
  8. import com.alibaba.json.test.entity.Department;
  9. import com.alibaba.json.test.entity.Employee;
  10. import com.alibaba.json.test.entity.Group;
  11. import com.fasterxml.jackson.core.JsonLocation;
  12. import com.fasterxml.jackson.core.JsonParseException;
  13. import com.fasterxml.jackson.core.JsonParser;
  14. import com.fasterxml.jackson.core.JsonToken;
  15. public class JacksonGroupParser {
  16. private JsonParser parser;
  17. public JacksonGroupParser(JsonParser parser) throws Exception{
  18. this.parser = parser;
  19. parser.nextToken(); // move to the start of the
  20. }
  21. public Group parseGroup() throws Exception {
  22. Group group = new Group();
  23. accept(JsonToken.START_OBJECT);
  24. for (;;) {
  25. JsonToken tok = parser.getCurrentToken();
  26. if (tok == JsonToken.END_OBJECT) {
  27. break;
  28. }
  29. if (tok == JsonToken.FIELD_NAME) {
  30. String name = parser.getCurrentName();
  31. tok = parser.nextToken();
  32. if ("name" == name) {
  33. group.setName(acceptString(tok));
  34. } else if ("description" == name) {
  35. group.setDescription(acceptString(tok));
  36. } else if ("companies" == name) {
  37. parseCompany(group.getCompanies());
  38. } else {
  39. throw new RuntimeException("not match property : " + name);
  40. }
  41. }
  42. }
  43. accept(JsonToken.END_OBJECT);
  44. return group;
  45. }
  46. private Company parseCompany() throws Exception {
  47. Company company = new Company();
  48. accept(JsonToken.START_OBJECT);
  49. for (;;) {
  50. JsonToken tok = parser.getCurrentToken();
  51. if (tok == JsonToken.END_OBJECT) {
  52. break;
  53. }
  54. if (tok == JsonToken.FIELD_NAME) {
  55. String name = parser.getCurrentName();
  56. tok = parser.nextToken();
  57. if ("name" == name) {
  58. company.setName(acceptString(tok));
  59. } else if ("description" == name) {
  60. company.setDescription(acceptString(tok));
  61. } else if ("stock" == name) {
  62. company.setStock(acceptString(tok));
  63. } else if ("id" == name) {
  64. company.setId(acceptLong(tok));
  65. } else if ("rootDepartment" == name) {
  66. company.setRootDepartment(parseDepartment());
  67. } else {
  68. throw new RuntimeException("not match property : " + name);
  69. }
  70. }
  71. }
  72. accept(JsonToken.END_OBJECT);
  73. return company;
  74. }
  75. private Department parseDepartment() throws Exception {
  76. accept(JsonToken.START_OBJECT);
  77. Department company = new Department();
  78. for (;;) {
  79. JsonToken tok = parser.getCurrentToken();
  80. if (tok == JsonToken.END_OBJECT) {
  81. break;
  82. }
  83. if (tok == JsonToken.FIELD_NAME) {
  84. String name = parser.getCurrentName();
  85. tok = parser.nextToken();
  86. if ("name" == name) {
  87. company.setName(acceptString(tok));
  88. } else if ("description" == name) {
  89. company.setDescription(acceptString(tok));
  90. } else if ("id" == name) {
  91. company.setId(acceptLong(tok));
  92. } else if ("children" == name) {
  93. parseDepartment(company.getChildren());
  94. } else if ("members" == name) {
  95. parseEmployee(company.getMembers());
  96. } else {
  97. throw new RuntimeException("not match property : " + name);
  98. }
  99. }
  100. }
  101. accept(JsonToken.END_OBJECT);
  102. return company;
  103. }
  104. private Employee parseEmployee() throws Exception {
  105. accept(JsonToken.START_OBJECT);
  106. Employee emp = new Employee();
  107. for (;;) {
  108. JsonToken tok = parser.getCurrentToken();
  109. if (tok == JsonToken.END_OBJECT) {
  110. break;
  111. }
  112. if (tok == JsonToken.FIELD_NAME) {
  113. String name = parser.getCurrentName();
  114. tok = parser.nextToken();
  115. if ("name" == name) {
  116. emp.setName(acceptString(tok));
  117. } else if ("description" == name) {
  118. emp.setDescription(acceptString(tok));
  119. } else if ("number" == name) {
  120. emp.setNumber(acceptString(tok));
  121. } else if ("id" == name) {
  122. emp.setId(acceptLong(tok));
  123. } else if ("age" == name) {
  124. emp.setAge(acceptInteger(tok));
  125. } else if ("salary" == name) {
  126. emp.setSalary(acceptBigDecimal(tok));
  127. } else if ("birthdate" == name) {
  128. emp.setBirthdate(new Date(acceptLong(tok)));
  129. } else if ("badboy" == name) {
  130. emp.setBadboy(acceptBoolean(tok));
  131. } else {
  132. throw new RuntimeException("not match property : " + name);
  133. }
  134. }
  135. }
  136. accept(JsonToken.END_OBJECT);
  137. return emp;
  138. }
  139. private void parseEmployee(List<Employee> list) throws Exception {
  140. accept(JsonToken.START_ARRAY);
  141. for (;;) {
  142. JsonToken tok = parser.getCurrentToken();
  143. if (tok == JsonToken.END_ARRAY) {
  144. break;
  145. }
  146. list.add(parseEmployee());
  147. }
  148. accept(JsonToken.END_ARRAY);
  149. }
  150. private void parseDepartment(List<Department> list) throws Exception {
  151. accept(JsonToken.START_ARRAY);
  152. for (;;) {
  153. JsonToken tok = parser.getCurrentToken();
  154. if (tok == JsonToken.END_ARRAY) {
  155. break;
  156. }
  157. list.add(parseDepartment());
  158. }
  159. accept(JsonToken.END_ARRAY);
  160. }
  161. private void parseCompany(List<Company> list) throws Exception {
  162. accept(JsonToken.START_ARRAY);
  163. for (;;) {
  164. JsonToken tok = parser.getCurrentToken();
  165. if (tok == JsonToken.END_ARRAY) {
  166. break;
  167. }
  168. list.add(parseCompany());
  169. }
  170. accept(JsonToken.END_ARRAY);
  171. }
  172. private String acceptString() throws Exception {
  173. if (parser.getCurrentToken() == JsonToken.VALUE_STRING) {
  174. String stringValue = parser.getText();
  175. parser.nextToken();
  176. return stringValue;
  177. } else {
  178. throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
  179. }
  180. }
  181. private String acceptString(JsonToken token) throws Exception {
  182. if (token == JsonToken.VALUE_STRING) {
  183. String stringValue = parser.getText();
  184. parser.nextToken();
  185. return stringValue;
  186. } else {
  187. throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
  188. }
  189. }
  190. private Long acceptLong(JsonToken token) throws Exception {
  191. if (token == JsonToken.VALUE_NUMBER_INT) {
  192. long value = parser.getLongValue();
  193. parser.nextToken();
  194. return value;
  195. } else {
  196. throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
  197. }
  198. }
  199. private boolean acceptBoolean(JsonToken token) throws Exception {
  200. if (token == JsonToken.VALUE_TRUE) {
  201. parser.nextToken();
  202. return true;
  203. } else if (token == JsonToken.VALUE_FALSE) {
  204. parser.nextToken();
  205. return false;
  206. } else {
  207. throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
  208. }
  209. }
  210. private BigDecimal acceptBigDecimal(JsonToken token) throws Exception {
  211. if (token == JsonToken.VALUE_NUMBER_FLOAT) {
  212. BigDecimal value = parser.getDecimalValue();
  213. parser.nextToken();
  214. return value;
  215. } else {
  216. throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
  217. }
  218. }
  219. private Integer acceptInteger(JsonToken token) throws Exception {
  220. if (token == JsonToken.VALUE_NUMBER_INT) {
  221. int value = parser.getIntValue();
  222. parser.nextToken();
  223. return value;
  224. } else {
  225. throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
  226. }
  227. }
  228. private void accept(JsonToken token) throws Exception {
  229. if (parser.getCurrentToken() == token) {
  230. parser.nextToken();
  231. } else {
  232. throw new JSONException("syntax error, expect " + token + ", actual " + parser.getCurrentToken());
  233. }
  234. }
  235. public static String getNextTextValue(String fieldName, JsonParser parser) throws JsonParseException, IOException {
  236. JsonToken current = parser.nextToken(); // move to filed
  237. if (current != JsonToken.FIELD_NAME || !fieldName.equals(parser.getCurrentName())) {
  238. reportParseError("Error occoured while getting value by field name:" + fieldName, parser.getCurrentLocation());
  239. }
  240. current = parser.nextToken(); // move to value
  241. return parser.getText();
  242. }
  243. public static void reportParseError(String errorMsg, JsonLocation jsonLoc) throws JsonParseException {
  244. throw new JsonParseException(errorMsg, jsonLoc);
  245. }
  246. }