Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 200f983

Browse files
author
code4wt
committed
重构了部分代码,并修正了一个 bug
这个bug出现在 CharReader peek 方法中,当 pos 为1024时,再调用 peek,peek 会调用 fillBuffer 方法读取新的数据进来,放返回 buffer[0],此时就不对了。真正应该返回的是调用 fillBuffer 读取新数据前的 buffer 中最后一个元素,即 buffer[1023]
1 parent 6c506db commit 200f983

File tree

7 files changed

+69
-59
lines changed

7 files changed

+69
-59
lines changed
Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
package com.titizz.jsonparser;
22

3+
import com.titizz.jsonparser.parser.Parser;
4+
import com.titizz.jsonparser.tokenizer.CharReader;
5+
import com.titizz.jsonparser.tokenizer.TokenList;
6+
import com.titizz.jsonparser.tokenizer.Tokenizer;
7+
38
import java.io.IOException;
9+
import java.io.StringReader;
410

511
/**
6-
* Created by imtian on 17/4/23.
12+
* Created by code4wt on 17/9/1.
713
*/
814
public class JSONParser {
915

10-
public static void main(String[] args) throws IOException {
16+
private Tokenizer tokenizer = new Tokenizer();
17+
18+
private Parser parser = new Parser();
1119

20+
public Object fromJSON(String json) throws IOException {
21+
CharReader charReader = new CharReader(new StringReader(json));
22+
TokenList tokens = tokenizer.tokenize(charReader);
23+
return parser.parse(tokens);
1224
}
1325
}

‎src/main/java/com/titizz/jsonparser/model/Json.java‎

Lines changed: 0 additions & 7 deletions
This file was deleted.

‎src/main/java/com/titizz/jsonparser/model/JsonArray.java‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package com.titizz.jsonparser.model;
22

3+
import com.titizz.jsonparser.BeautifyJsonUtils;
34
import com.titizz.jsonparser.exception.JsonTypeException;
45

56
import java.util.ArrayList;
7+
import java.util.Iterator;
68
import java.util.List;
79

810
/**
911
* Created by code4wt on 17/5/19.
1012
*/
11-
public class JsonArray implements Json {
13+
public class JsonArray implements Iterable {
1214

1315
private List list = new ArrayList();
1416

@@ -20,6 +22,10 @@ public Object get(int index) {
2022
return list.get(index);
2123
}
2224

25+
public int size() {
26+
return list.size();
27+
}
28+
2329
public JsonObject getJsonObject(int index) {
2430
Object obj = list.get(index);
2531
if (!(obj instanceof JsonObject)) {
@@ -40,8 +46,10 @@ public JsonArray getJsonArray(int index) {
4046

4147
@Override
4248
public String toString() {
43-
return "JsonArray{" +
44-
"list=" + list +
45-
'}';
49+
return BeautifyJsonUtils.beautify(this);
50+
}
51+
52+
public Iterator iterator() {
53+
return list.iterator();
4654
}
4755
}

‎src/main/java/com/titizz/jsonparser/model/JsonObject.java‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package com.titizz.jsonparser.model;
22

3+
import com.titizz.jsonparser.BeautifyJsonUtils;
34
import com.titizz.jsonparser.exception.JsonTypeException;
45

6+
import java.util.ArrayList;
57
import java.util.HashMap;
8+
import java.util.List;
69
import java.util.Map;
710

811
/**
912
* Created by code4wt on 17/5/19.
1013
*/
11-
public class JsonObject implementsJson{
14+
public class JsonObject {
1215

1316
private Map<String, Object> map = new HashMap<String, Object>();
1417

@@ -20,6 +23,10 @@ public Object get(String key) {
2023
return map.get(key);
2124
}
2225

26+
public List<Map.Entry<String, Object>> getAllKeyValue() {
27+
return new ArrayList<>(map.entrySet());
28+
}
29+
2330
public JsonObject getJsonObject(String key) {
2431
if (!map.containsKey(key)) {
2532
throw new IllegalArgumentException("Invalid key");
@@ -45,4 +52,9 @@ public JsonArray getJsonArray(String key) {
4552

4653
return (JsonArray) obj;
4754
}
55+
56+
@Override
57+
public String toString() {
58+
return BeautifyJsonUtils.beautify(this);
59+
}
4860
}

‎src/main/java/com/titizz/jsonparser/parser/Parser.java‎

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.titizz.jsonparser.parser;
22

33
import com.titizz.jsonparser.exception.JsonParseException;
4-
import com.titizz.jsonparser.model.Json;
54
import com.titizz.jsonparser.model.JsonArray;
65
import com.titizz.jsonparser.model.JsonObject;
76
import com.titizz.jsonparser.tokenizer.Token;
@@ -27,11 +26,12 @@ public class Parser {
2726

2827
private TokenList tokens;
2928

30-
public Parser(TokenList tokens) {
29+
public Objectparse(TokenList tokens) {
3130
this.tokens = tokens;
31+
return parse();
3232
}
3333

34-
publicJson parse() {
34+
privateObject parse() {
3535
Token token = tokens.next();
3636
if (token == null) {
3737
return new JsonObject();
@@ -44,9 +44,9 @@ public Json parse() {
4444
}
4545
}
4646

47-
public JsonObject parseJsonObject() {
47+
private JsonObject parseJsonObject() {
4848
JsonObject jsonObject = new JsonObject();
49-
int expectToken = STRING_TOKEN | END_OBJECT_TOKEN;
49+
int expectToken = STRING_TOKEN | BEGIN_OBJECT_TOKEN | END_OBJECT_TOKEN;
5050
String key = null;
5151
Object value = null;
5252
while (tokens.hasMore()) {
@@ -87,7 +87,12 @@ public JsonObject parseJsonObject() {
8787
if (tokenValue.contains(".") || tokenValue.contains("e") || tokenValue.contains("E")) {
8888
jsonObject.put(key, Double.valueOf(tokenValue));
8989
} else {
90-
jsonObject.put(key, Integer.valueOf(tokenValue));
90+
Long num = Long.valueOf(tokenValue);
91+
if (num > Integer.MAX_VALUE) {
92+
jsonObject.put(key, num);
93+
} else {
94+
jsonObject.put(key, num.intValue());
95+
}
9196
}
9297
expectToken = SEP_COMMA_TOKEN | END_OBJECT_TOKEN | END_ARRAY_TOKEN;
9398
break;
@@ -133,8 +138,8 @@ public JsonObject parseJsonObject() {
133138
throw new JsonParseException("Parse error, invalid Token.");
134139
}
135140

136-
public JsonArray parseJsonArray() {
137-
int expectToken = END_ARRAY_TOKEN | BEGIN_OBJECT_TOKEN | NULL_TOKEN
141+
private JsonArray parseJsonArray() {
142+
int expectToken = BEGIN_ARRAY_TOKEN | END_ARRAY_TOKEN | BEGIN_OBJECT_TOKEN | NULL_TOKEN
138143
| NUMBER_TOKEN | BOOLEAN_TOKEN | STRING_TOKEN;
139144
JsonArray jsonArray = new JsonArray();
140145
while (tokens.hasMore()) {
@@ -146,15 +151,16 @@ public JsonArray parseJsonArray() {
146151
if ((tokenType.getTokenCode() & expectToken) == 0) {
147152
throw new JsonParseException("Parse error, invalid Token.");
148153
}
149-
parseJsonObject();
154+
jsonArray.add(parseJsonObject());
150155
expectToken = SEP_COMMA_TOKEN | END_OBJECT_TOKEN | END_ARRAY_TOKEN;
151156
break;
152157
case BEGIN_ARRAY:
153158
if ((tokenType.getTokenCode() & expectToken) == 0) {
154159
throw new JsonParseException("Parse error, invalid Token.");
155160
}
156161
jsonArray.add(parseJsonArray());
157-
expectToken = SEP_COMMA_TOKEN | END_OBJECT_TOKEN | END_DOCUMENT_TOKEN;
162+
expectToken = SEP_COMMA_TOKEN | END_OBJECT_TOKEN | END_ARRAY_TOKEN | END_DOCUMENT_TOKEN;
163+
break;
158164
case END_ARRAY:
159165
if ((tokenType.getTokenCode() & expectToken) == 0) {
160166
throw new JsonParseException("Parse error, invalid Token.");
@@ -208,4 +214,4 @@ public JsonArray parseJsonArray() {
208214

209215
throw new JsonParseException("Parse error, invalid Token.");
210216
}
211-
}
217+
}

‎src/main/java/com/titizz/jsonparser/tokenizer/CharReader.java‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,20 @@ public class CharReader {
1414

1515
private char[] buffer;
1616

17+
private char[] tmp;
18+
1719
private int pos;
1820

1921
private int size;
2022

2123
public CharReader(Reader reader) {
2224
this.reader = reader;
2325
buffer = new char[BUFFER_SIZE];
26+
tmp = new char[BUFFER_SIZE - 1];
2427
}
2528

2629
public char peek() throws IOException {
27-
if (!hasMore()) {
30+
if (pos - 1 >= size) {
2831
return (char) -1;
2932
}
3033

‎src/main/java/com/titizz/jsonparser/tokenizer/Tokenizer.java‎

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package com.titizz.jsonparser.tokenizer;
22

33
import com.titizz.jsonparser.exception.JsonParseException;
4-
import com.titizz.jsonparser.model.Json;
5-
import com.titizz.jsonparser.parser.Parser;
64

75
import java.io.IOException;
8-
import java.io.StringReader;
96

107
/**
118
* Created by code4wt on 17/5/10.
@@ -16,12 +13,15 @@ public class Tokenizer {
1613

1714
private TokenList tokens;
1815

19-
public Tokenizer(CharReader charReader, TokenListtokens) {
16+
public TokenListtokenize(CharReader charReader) throwsIOException {
2017
this.charReader = charReader;
21-
this.tokens = tokens;
18+
tokens = new TokenList();
19+
tokenize();
20+
21+
return tokens;
2222
}
2323

24-
public void tokenize() throws IOException {
24+
private void tokenize() throws IOException {
2525
// 使用do-while处理空文件
2626
Token token;
2727
do {
@@ -82,6 +82,9 @@ private Token readString() throws IOException {
8282
StringBuilder sb = new StringBuilder();
8383
for (;;) {
8484
char ch = charReader.next();
85+
if (ch == '泠') {
86+
int a = 1;
87+
}
8588
if (ch == '\\') {
8689
if (!isEscape()) {
8790
throw new JsonParseException("Invalid escape character");
@@ -257,31 +260,4 @@ private Token readNull() throws IOException {
257260

258261
return new Token(TokenType.NULL, "null");
259262
}
260-
261-
public static void main(String[] args) throws IOException {
262-
String json = "{\"a\": \"ab\\ncd\", \"b\": true, \"c\": false, \"d\": null, \"f\": -0.2e+2, {\"a\": [1, 0.1, 1.1e+5]}}";
263-
json = "-0.1e+2";
264-
json = "0000";
265-
json = "-000-0";
266-
json = "123.123";
267-
json = "-123.123";
268-
json = "12.3e-2";
269-
json = "-12.3e-2";
270-
json = "1a.5";
271-
json = "0.000000123E+1024";
272-
json = "{\"a\": 1, \"b\": \"b\", \"c\": {\"a\": 1, \"b\": null, \"c\": [0.1, \"a\", 1,2, 123, 1.23e+10, true, null]}}";
273-
json = "[0.1, \"a\", 1,2, 123, 1.23e+10, true, null]";
274-
CharReader charReader = new CharReader(new StringReader(json));
275-
TokenList tokens = new TokenList();
276-
Tokenizer tokenizer = new Tokenizer(charReader, tokens);
277-
tokenizer.tokenize();
278-
Parser parser = new Parser(tokens);
279-
Json jo = parser.parse();
280-
System.out.println(tokens);
281-
System.out.println(jo);
282-
// System.out.println(((JsonObject) jo).get("a"));
283-
// System.out.println(((JsonObject) jo).get("b"));
284-
// System.out.println(((JsonObject) jo).getJsonObject("c").get("a"));
285-
// System.out.println(((JsonObject) jo).getJsonObject("c").getJsonArray("c"));
286-
}
287263
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /