使用javacc 将json字串转换为Map和List组合的java对象

学习使用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
}

你可能感兴趣的:(java,jdk,c,json,F#)