学习使用javacc,将一个json字串转化为Map和list组合的java对象
options{
JDK_VERSION = "1.5";
UNICODE_INPUT = true;
STATIC = false;
}
PARSER_BEGIN(JSONParser)
package com.yy.ah.json;
//
import java.io.StringReader;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
//
public class JSONParser{
public JSONParser(){
this (new StringReader(""));
}
public Map parser(String json)throws ParseException{
ReInit(new StringReader(json));
return object();
}
}
PARSER_END(JSONParser)
SKIP:{
" " | "\r" | "\t" | "\n"
}
TOKEN:/* LITERALS */
{
<TRUE:"true">
| <FALSE:"false">
| <NULL:"null">
| <INTEGER_LITERAL:<DECIMAL_LITERAL>(["l", "L"])?
| <HEX_LITERAL>(["l", "L"])?
| <OCTAL_LITERAL>(["l", "L"])?>
| <#DECIMAL_LITERAL:["1"-"9"](["0"-"9"])*>
| <#HEX_LITERAL:"0"["x", "X"](["0"-"9", "a"-"f", "A"-"F"])+>
| <#OCTAL_LITERAL:"0"(["0"-"7"])*>
| <FLOATING_POINT_LITERAL:(["0"-"9"])+"."(["0"-"9"])*(<EXPONENT>)?(["f", "F", "d", "D"])?
| "."(["0"-"9"])+(<EXPONENT>)?(["f", "F", "d", "D"])?
| (["0"-"9"])+<EXPONENT>(["f", "F", "d", "D"])?
| (["0"-"9"])+(<EXPONENT>)?["f", "F", "d", "D"]>
| <#EXPONENT:["e", "E"](["+", "-"])?(["0"-"9"])+>
| <STRING_LITERAL:("\""((~["\"", "\\", "\n", "\r"])
| ("\\"(["n", "t", "b", "r", "f", "\\", "'", "\""]
| ["0"-"7"](["0"-"7"])?
| ["0"-"3"]["0"-"7"]["0"-"7"])))*"\"")
| ("'"((~["\'", "\\", "\n", "\r"])
| ("\\"(["n", "t", "b", "r", "f", "\\", "'", "\""]
| ["0"-"7"](["0"-"7"])?
| ["0"-"3"]["0"-"7"]["0"-"7"])))*"'")>
}
TOKEN:/* IDENTIFIERS */
{
<ID:<LETTER>(<LETTER>
| <DIGIT>)*>
| <#LETTER:["\u0024", "\u0041"-"\u005a", "\u005f", "\u0061"-"\u007a", "\u00c0"-"\u00d6", "\u00d8"-"\u00f6", "\u00f8"-"\u00ff", "\u0100"-"\u1fff", "\u3040"-"\u318f", "\u3300"-"\u337f", "\u3400"-"\u3d2d", "\u4e00"-"\u9fff", "\uf900"-"\ufaff"]>
| <#DIGIT:["\u0030"-"\u0039", "\u0660"-"\u0669", "\u06f0"-"\u06f9", "\u0966"-"\u096f", "\u09e6"-"\u09ef", "\u0a66"-"\u0a6f", "\u0ae6"-"\u0aef", "\u0b66"-"\u0b6f", "\u0be7"-"\u0bef", "\u0c66"-"\u0c6f", "\u0ce6"-"\u0cef", "\u0d66"-"\u0d6f", "\u0e50"-"\u0e59", "\u0ed0"-"\u0ed9", "\u1040"-"\u1049"]>
}
/** */
Map object():{
Map map = new HashMap();
String key;
Object value;
}
{
"{"(key = key()":"value = value(){
map.put(key, value);
}
)?(","(key = key()":"value = value(){
map.put(key, value);
}
))*"}"{
return map;
}
}
/** */
String key():{
Token t;
String value;
}
{
t = <ID>{ return t.image;} | value = string(){ return value;}
}
/** */
Number number():{
Token t;
}
{
t = <INTEGER_LITERAL>{
char lastChar = t.image.charAt(t.image.length()-1);
if (lastChar == 'l' || lastChar == 'L'){
return Long.parseLong(t.image);
} else {
return Integer.parseInt(t.image);
}
}
| t = <FLOATING_POINT_LITERAL>{
lastChar = t.image.charAt(t.image.length()-1);
if (lastChar == 'f' || lastChar == 'F'){
return Float.parseFloat(t.image);
} else {
return Double.parseDouble(t.image);
}
}
}
/** */
String string():{
Token t;
}
{
t = <STRING_LITERAL>{
return Utils.getString(t.image.substring(1, t.image.length()-1));
}
}
/** */
Object value():{
Object obj;
}
{
(obj = string()
| obj = number()
| obj = object()
| obj = array()
| <TRUE>{ obj = true;}
| <FALSE>{ obj = false;}
| <NULL>{ obj = null;}
){
return obj;
}
}
/** */
List array():{
List list = new ArrayList();
Object obj;
}
{
"["(obj = value(){ list.add(obj);})?(","obj = value(){ list.add(obj);})*"]"{
return list;
}
}
测试代码:
public static void main(String[] args) throws ParseException {
String json = "{orgidList:[{orgid:23},{\"orgid\":'21'},{'orgid':'22'}],c:12455}";
Map<String,Object> map = new JSONParser().parser(json);
System.out.println(map);
List<Map<String,Object>> array = (List<Map<String,Object>>) map.get("orgidList");
for (int i = 0, len = array.size(); i < len; i++) {
Map<String,Object> object = array.get(i);
System.out.println(object.get("orgid"));
}
System.out.println(map.get("c"));
// 输出:
// 23
// 21
// 22
// 12455
}