java校验json格式及内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java校验json格式及内容相关的知识,希望对你有一定的参考价值。


"CommodityClass":
"ID":
"Type": "String",

,
"Name":
"Type": "String",

,
"Brand":
"Type": "String",




类似此格式,必须要,然后内部字母开头可以包含字母和数字

参考技术A 代码如下
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格式及内容的主要内容,如果未能解决你的问题,请参考以下文章

JSON在线解析及格式化校验工具 jsonin.com

[工具]JSON校验转换在线工具

Java后台 解析JSON的几个方法

校验字符串是否是JSON格式,将不规则展示的json格式的字符串进行规则展示(json格式化)

校验是否是json格式(转)

JSON格式校验