package com.alibaba.json.demo;
import junit.framework.TestCase;
/**
* Created by wenshao on 10/03/2017.
*/
public class Forguard extends TestCase {
public void test_0() throws Exception {
String json = "{\"id\":\"a123\", \"name\":\"wxf\"}";
String value = javaGet(json, "id");
System.out.println(value);
}
public static String javaGet(String json, String key) {
char[] json_chars = json.toCharArray();
char[] key_chars = key.toCharArray();
char[] value_chars = get(json_chars, json_chars.length, key_chars, key_chars.length);
return new String(value_chars);
}
public static char[] get(char[] json, int json_len, char[] key, int key_len) {
if (json_len == 0) {
return new char[0];
}
Parser parser = new Parser();
parser.json_chars = json;
parser.json_len = json_len;
parser.ch = json[0];
next_token(parser);
if (parser.token != Token.LBRACE) {
throw new IllegalArgumentException("illegal json");
}
next_token(parser);
for (;;) {
if (parser.token == Token.RBRACE) {
break;
}
if (parser.token != Token.STRING) {
throw new IllegalArgumentException("illegal json");
}
char[] name_chars = parser.str_chars;
int name_len = parser.str_chars_len;
next_token(parser);
if (parser.token != Token.COLON) {
throw new IllegalArgumentException("illegal json");
}
next_token(parser);
if (parser.token != Token.STRING) {
throw new IllegalArgumentException("illegal json");
}
if (name_len == key_len) {
boolean eq = true;
for (int i = 0; i < name_len; ++i) {
if (name_chars[i] != key[i]) {
eq = false;
break;
}
}
if (eq) {
return parser.str_chars;
}
}
next_token(parser);
if (parser.token == Token.COMMA) {
next_token(parser);
continue;
}
}
return null;
}
public static class Parser {
public char[] json_chars;
public int json_len;
public char[] str_chars;
public int str_chars_len;
public char ch;
public int pos;
public Token token;
}
public static void next_char(Parser parser) {
parser.ch = (++parser.pos) < parser.json_len ? parser.json_chars[parser.pos] : '\0';
}
public static void scanString(Parser parser) {
next_char(parser);
int start = parser.pos;
int end;
for (;;) {
if (parser.pos >= parser.json_len) {
throw new IllegalArgumentException("illegal string");
}
if (parser.ch == '"') {
end = parser.pos;
next_char(parser);
break;
}
if (parser.ch == '\\') {
throw new IllegalArgumentException("illegal string");
}
next_char(parser);
}
parser.str_chars_len = end - start;
parser.str_chars = new char[parser.str_chars_len];
for (int i = 0; i < parser.str_chars_len; ++i) {
parser.str_chars[i] = parser.json_chars[start + i];
}
parser.token = Token.STRING;
}
public static void next_token(Parser parser) {
for (;;) {
int ch = parser.ch;
boolean isWhiteSpace = ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t';
if (isWhiteSpace) {
next_char(parser);
continue;
}
if (parser.pos >= parser.json_len) {
parser.token = Token.EOF;
return;
}
break;
}
switch (parser.ch) {
case '{':
parser.token = Token.LBRACE;
next_char(parser);
break;
case '}':
parser.token = Token.RBRACE;
next_char(parser);
break;
case ',':
parser.token = Token.COMMA;
next_char(parser);
break;
case ':':
parser.token = Token.COLON;
next_char(parser);
break;
case '"':
scanString(parser);
break;
default:
throw new IllegalArgumentException("illegal json char");
}
}
public static enum Token {
STRING, //
EOF, //
LBRACE,
RBRACE,
COMMA,
COLON
}
}