[Java] Java校验一个字符串是否是合法的JSON格式 →→→→→进入此内容的聊天室

来自 , 2019-11-10, 写在 Java, 查看 134 次.
URL http://www.code666.cn/view/5055cbf4
  1. /**
  2.  * 用于校验一个字符串是否是合法的JSON格式
  3.  *
  4.  */
  5. import java.text.CharacterIterator;
  6. import java.text.StringCharacterIterator;
  7.  
  8. public class JsonValidator {
  9.  
  10.     private CharacterIterator it;
  11.     private char              c;
  12.     private int               col;
  13.  
  14.     public JsonValidator(){
  15.     }
  16.  
  17.     /**
  18.      * 验证一个字符串是否是合法的JSON串
  19.      *
  20.      * @param input 要验证的字符串
  21.      * @return true-合法 ,false-非法
  22.      */
  23.     public boolean validate(String input) {
  24.         input = input.trim();
  25.         boolean ret = valid(input);
  26.         return ret;
  27.     }
  28.  
  29.     private boolean valid(String input) {
  30.         if ("".equals(input)) return true;
  31.  
  32.         boolean ret = true;
  33.         it = new StringCharacterIterator(input);
  34.         c = it.first();
  35.         col = 1;
  36.         if (!value()) {
  37.             ret = error("value", 1);
  38.         } else {
  39.             skipWhiteSpace();
  40.             if (c != CharacterIterator.DONE) {
  41.                 ret = error("end", col);
  42.             }
  43.         }
  44.  
  45.         return ret;
  46.     }
  47.  
  48.     private boolean value() {
  49.         return literal("true") || literal("false") || literal("null") || string() || number() || object() || array();
  50.     }
  51.  
  52.     private boolean literal(String text) {
  53.         CharacterIterator ci = new StringCharacterIterator(text);
  54.         char t = ci.first();
  55.         if (c != t) return false;
  56.  
  57.         int start = col;
  58.         boolean ret = true;
  59.         for (t = ci.next(); t != CharacterIterator.DONE; t = ci.next()) {
  60.             if (t != nextCharacter()) {
  61.                 ret = false;
  62.                 break;
  63.             }
  64.         }
  65.         nextCharacter();
  66.         if (!ret) error("literal " + text, start);
  67.         return ret;
  68.     }
  69.  
  70.     private boolean array() {
  71.         return aggregate('[', ']', false);
  72.     }
  73.  
  74.     private boolean object() {
  75.         return aggregate('{', '}', true);
  76.     }
  77.  
  78.     private boolean aggregate(char entryCharacter, char exitCharacter, boolean prefix) {
  79.         if (c != entryCharacter) return false;
  80.         nextCharacter();
  81.         skipWhiteSpace();
  82.         if (c == exitCharacter) {
  83.             nextCharacter();
  84.             return true;
  85.         }
  86.  
  87.         for (;;) {
  88.             if (prefix) {
  89.                 int start = col;
  90.                 if (!string()) return error("string", start);
  91.                 skipWhiteSpace();
  92.                 if (c != ':') return error("colon", col);
  93.                 nextCharacter();
  94.                 skipWhiteSpace();
  95.             }
  96.             if (value()) {
  97.                 skipWhiteSpace();
  98.                 if (c == ',') {
  99.                     nextCharacter();
  100.                 } else if (c == exitCharacter) {
  101.                     break;
  102.                 } else {
  103.                     return error("comma or " + exitCharacter, col);
  104.                 }
  105.             } else {
  106.                 return error("value", col);
  107.             }
  108.             skipWhiteSpace();
  109.         }
  110.  
  111.         nextCharacter();
  112.         return true;
  113.     }
  114.  
  115.     private boolean number() {
  116.         if (!Character.isDigit(c) && c != '-') return false;
  117.         int start = col;
  118.         if (c == '-') nextCharacter();
  119.         if (c == '0') {
  120.             nextCharacter();
  121.         } else if (Character.isDigit(c)) {
  122.             while (Character.isDigit(c))
  123.                 nextCharacter();
  124.         } else {
  125.             return error("number", start);
  126.         }
  127.         if (c == '.') {
  128.             nextCharacter();
  129.             if (Character.isDigit(c)) {
  130.                 while (Character.isDigit(c))
  131.                     nextCharacter();
  132.             } else {
  133.                 return error("number", start);
  134.             }
  135.         }
  136.         if (c == 'e' || c == 'E') {
  137.             nextCharacter();
  138.             if (c == '+' || c == '-') {
  139.                 nextCharacter();
  140.             }
  141.             if (Character.isDigit(c)) {
  142.                 while (Character.isDigit(c))
  143.                     nextCharacter();
  144.             } else {
  145.                 return error("number", start);
  146.             }
  147.         }
  148.         return true;
  149.     }
  150.  
  151.     private boolean string() {
  152.         if (c != '"') return false;
  153.  
  154.         int start = col;
  155.         boolean escaped = false;
  156.         for (nextCharacter(); c != CharacterIterator.DONE; nextCharacter()) {
  157.             if (!escaped && c == '\\') {
  158.                 escaped = true;
  159.             } else if (escaped) {
  160.                 if (!escape()) {
  161.                     return false;
  162.                 }
  163.                 escaped = false;
  164.             } else if (c == '"') {
  165.                 nextCharacter();
  166.                 return true;
  167.             }
  168.         }
  169.         return error("quoted string", start);
  170.     }
  171.  
  172.     private boolean escape() {
  173.         int start = col - 1;
  174.         if (" \\\"/bfnrtu".indexOf(c) < 0) {
  175.             return error("escape sequence  \\\",\\\\,\\/,\\b,\\f,\\n,\\r,\\t  or  \\uxxxx ", start);
  176.         }
  177.         if (c == 'u') {
  178.             if (!ishex(nextCharacter()) || !ishex(nextCharacter()) || !ishex(nextCharacter())
  179.                 || !ishex(nextCharacter())) {
  180.                 return error("unicode escape sequence  \\uxxxx ", start);
  181.             }
  182.         }
  183.         return true;
  184.     }
  185.  
  186.     private boolean ishex(char d) {
  187.         return "0123456789abcdefABCDEF".indexOf(c) >= 0;
  188.     }
  189.  
  190.     private char nextCharacter() {
  191.         c = it.next();
  192.         ++col;
  193.         return c;
  194.     }
  195.  
  196.     private void skipWhiteSpace() {
  197.         while (Character.isWhitespace(c)) {
  198.             nextCharacter();
  199.         }
  200.     }
  201.  
  202.     private boolean error(String type, int col) {
  203.          System.out.printf("type: %s, col: %s%s", type, col, System.getProperty("line.separator"));
  204.         return false;
  205.     }
  206.     public static void main(String[] args){
  207.         String jsonStr = "{\"website\":\"oschina.net\"}";
  208.         System.out.println(jsonStr+":"+new JsonValidator().validate(jsonStr));
  209.     }
  210. }
  211.  
  212. //源代码片段来自云代码http://yuncode.net
  213.                        

回复 "Java校验一个字符串是否是合法的JSON格式"

这儿你可以回复上面这条便签

captcha