java校验json格式及内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java校验json格式及内容相关的知识,希望对你有一定的参考价值。
"CommodityClass":
"ID":
"Type": "String",
,
"Name":
"Type": "String",
,
"Brand":
"Type": "String",
类似此格式,必须要,然后内部字母开头可以包含字母和数字
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
public class JsonValidator
private CharacterIterator it;
private char c;
private int col;
public JsonValidator()
/**
* 验证一个字符串是否是合法的JSON串
*
* @param input 要验证的字符串
* @return true-合法 ,false-非法
*/
public boolean validate(String input)
input = input.trim();
boolean ret = valid(input);
return ret;
private boolean valid(String input)
if ("".equals(input)) return true;
boolean ret = true;
it = new StringCharacterIterator(input);
c = it.first();
col = 1;
if (!value())
ret = error("value", 1);
else
skipWhiteSpace();
if (c != CharacterIterator.DONE)
ret = error("end", col);
return ret;
private boolean value()
return literal("true") || literal("false") || literal("null") || string() || number() || object() || array();
private boolean literal(String text)
CharacterIterator ci = new StringCharacterIterator(text);
char t = ci.first();
if (c != t) return false;
int start = col;
boolean ret = true;
for (t = ci.next(); t != CharacterIterator.DONE; t = ci.next())
if (t != nextCharacter())
ret = false;
break;
nextCharacter();
if (!ret) error("literal " + text, start);
return ret;
private boolean array()
return aggregate('[', ']', false);
private boolean object()
return aggregate('', '', true);
private boolean aggregate(char entryCharacter, char exitCharacter, boolean prefix)
if (c != entryCharacter) return false;
nextCharacter();
skipWhiteSpace();
if (c == exitCharacter)
nextCharacter();
return true;
for (;;)
if (prefix)
int start = col;
if (!string()) return error("string", start);
skipWhiteSpace();
if (c != ':') return error("colon", col);
nextCharacter();
skipWhiteSpace();
if (value())
skipWhiteSpace();
if (c == ',')
nextCharacter();
else if (c == exitCharacter)
break;
else
return error("comma or " + exitCharacter, col);
else
return error("value", col);
skipWhiteSpace();
nextCharacter();
return true;
private boolean number()
if (!Character.isDigit(c) && c != '-') return false;
int start = col;
if (c == '-') nextCharacter();
if (c == '0')
nextCharacter();
else if (Character.isDigit(c))
while (Character.isDigit(c))
nextCharacter();
else
return error("number", start);
if (c == '.')
nextCharacter();
if (Character.isDigit(c))
while (Character.isDigit(c))
nextCharacter();
else
return error("number", start);
if (c == 'e' || c == 'E')
nextCharacter();
if (c == '+' || c == '-')
nextCharacter();
if (Character.isDigit(c))
while (Character.isDigit(c))
nextCharacter();
else
return error("number", start);
return true;
private boolean string()
if (c != '"') return false;
int start = col;
boolean escaped = false;
for (nextCharacter(); c != CharacterIterator.DONE; nextCharacter())
if (!escaped && c == '\\')
escaped = true;
else if (escaped)
if (!escape())
return false;
escaped = false;
else if (c == '"')
nextCharacter();
return true;
return error("quoted string", start);
private boolean escape()
int start = col - 1;
if (" \\\"/bfnrtu".indexOf(c) < 0)
return error("escape sequence \\\",\\\\,\\/,\\b,\\f,\\n,\\r,\\t or \\uxxxx ", start);
if (c == 'u')
if (!ishex(nextCharacter()) || !ishex(nextCharacter()) || !ishex(nextCharacter())
|| !ishex(nextCharacter()))
return error("unicode escape sequence \\uxxxx ", start);
return true;
private boolean ishex(char d)
return "0123456789abcdefABCDEF".indexOf(c) >= 0;
private char nextCharacter()
c = it.next();
++col;
return c;
private void skipWhiteSpace()
while (Character.isWhitespace(c))
nextCharacter();
private boolean error(String type, int col)
System.out.printf("type: %s, col: %s%s", type, col, System.getProperty("line.separator"));
return false;
public static void main(String[] args)
String jsonStr = "\"website\":\"open-open.com\"";
System.out.println(jsonStr+":"+new JsonValidator().validate(jsonStr));
使用WisdomTool RESTClient进行自动化测试,如何取消对返回的body内容的校验?对排除的JSON属性字段不做校验?
使用 Wisdom RESTClient 进行自动化测试 REST API,默认是对返回HTTP状态码和body内容都进行严格匹配和校验。
(1). 如果每次触发API返回的body内容是动态变化的,可以取消对body内容进行校验;
(2). 如果API返回的body是JSON格式 ,需要排除某些属性字段,对其不进行校验,只校验排除后的属性字段;
(3). 对HTTP请求和响应的内容进行修改。
上述三种情况都可以在 History Detail 窗口界面上进行设置。
选择 History 视图,选中一条记录,右键菜单栏里选择 Configure 打开 History Detail 窗口。
取消对body内容进行校验,在右侧窗体里取消勾选 Assert Body,这样自动化测试这条记录就不会对body内容进行校验,默认只校验HTTP状态码。
排除某些属性字段,对其不进行校验,在右侧窗体里先勾选上 Assert Body ,这样会对body内容进行校验,当然默认也会校验HTTP状态码。
然后在右侧窗体里 Viewer 视图上对展开的JSON节点进行勾选,勾选上的节点即为待排除不对其进行校验的属性字段。
在 History Detail 窗口也可以对如下HTTP请求和响应的内容进行修改:
HTTP 方法 - HTTP Method
URL - Request URL
HTTP请求的消息头 - HTTP Request Header
HTTP请求的消息体 - HTTP Request Body
HTTP响应状的态码 - HTTP Status
HTTP响应的消息体 - HTTP Response Body
History记录的描述 - Description
注意事项:
(1). 默认会校验HTTP状态码,对状态码的修改必须要跟预期的结果一致。
(2). 如果没有取消勾选 Assert Body ,默认会校验HTTP响应的Body内容,对其进行严格字符串匹配。 所以修改一定要慎重,必须保持跟服务端返回的内容和格式完全一致。
(3). 勾选展开的JSON节点,会排除选中的节点,从而对其不进行校验,没有被勾选中的节点都会进行匹配和校验,这个功能的前提是要勾选上 Assert Body 。
以上是关于java校验json格式及内容的主要内容,如果未能解决你的问题,请参考以下文章