package org.test4j.json.helper; import org.test4j.json.JSON; import org.test4j.testng.Test4J; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @Test(groups = { "test4j", "json" }) public class JSONScannerTest extends Test4J { @Test(dataProvider = "jsonKeysData") public void testScanMapKey(String json, String key, boolean quotationMark) { JSONScanner scanner = new JSONScanner(json.toCharArray()); JSONObject value = scanner.scanMapKey(); want.object(value).notNull() .propertyEq(new String[] { "value", "quotationMark" }, new Object[] { key, quotationMark }); char ch = scanner.nextToken(); want.character(ch).is(':'); } @DataProvider public Object[][] jsonKeysData() { return new Object[][] { { "\"key1\":\"value1\"", "key1", true },// <br> { "key 1:'value1'", "key 1", false }, /** <br> */ { "'key 1':'value1'", "key 1", true }, /** <br> */ { "'has \"':'value1'", "has \"", true }, /** <br> */ { "'has \\'':'value1'", "has '", true }, /** <br> */ { "'\\u662f\u5426':'是否'", "是否", true }, /** <br> */ { "是否:'是否'", "是否", false } /** <br> */ }; } @Test(dataProvider = "jsonValuesData") public void testScanMapValue(String json, String key, boolean quotationMark) { JSONScanner scanner = new JSONScanner(json.toCharArray()); scanner.scanMapKey(); scanner.nextToken(); JSONObject value = scanner.scanMapValue(); want.object(value).notNull() .propertyEq(new String[] { "value", "quotationMark" }, new Object[] { key, quotationMark }); } @DataProvider public Object[][] jsonValuesData() { return new Object[][] { { "\"key1\":\"value1\"}", "value1", true },// <br> { "key 1:value 1}", "value 1", false }, /** <br> */ { "'key 1':'value1'}", "value1", true }, /** <br> */ { "'has \"':'has \"'}", "has \"", true }, /** <br> */ { "'has \\'':'has \\''}", "has '", true }, /** <br> */ { "'是否':'\\u662f\u5426'}", "是否", true } /** <br> */ }; } @Test public void testScanJSONMap_Simple() { String json = "{'key1':'value1'}"; JSONScanner scanner = new JSONScanner(json.toCharArray()); char ch = scanner.nextToken(); want.character(ch).is('{'); JSONMap map = scanner.scanJSONMap(); want.map(map).notNull().hasEntry(JSONSingle.newInstance("key1"), JSONSingle.newInstance("value1")); } @Test public void testScanJSONArray_Simple() { String json = "['value1','value2']"; JSONScanner scanner = new JSONScanner(json.toCharArray()); char ch = scanner.nextToken(); want.character(ch).is('['); JSONArray array = scanner.scanJSONArray(); want.collection(array).notNull() .hasAllItems(JSONSingle.newInstance("value1"), JSONSingle.newInstance("value2")); } @Test public void testScanJSONMap_complex() { String json = "{['value1','value2']:{'key1':'value1'}}"; JSONScanner scanner = new JSONScanner(json.toCharArray()); char ch = scanner.nextToken(); want.character(ch).is('{'); JSONMap map = scanner.scanJSONMap(); want.map(map).sizeEq(1); JSONObject key = map.keySet().iterator().next(); want.string(key.toString()).eqIgnoreSpace("[value1,value2]"); } @Test public void testScanJSONArray_complex() { String json = "[{'key1':'value1'},{'key2':'value2'}]"; JSONScanner scanner = new JSONScanner(json.toCharArray()); char ch = scanner.nextToken(); want.character(ch).is('['); JSONArray array = scanner.scanJSONArray(); want.collection(array).notNull().sizeEq(2); } @Test public void testScanJSONValue() { String json = "-0.3e1234"; JSONScanner scanner = new JSONScanner(json.toCharArray()); JSONSingle value = scanner.scanJSONValue(); want.object(value).propertyEq(new String[] { "value", "quotationMark" }, new Object[] { "-0.3e1234", false }); } @Test(dataProvider = "errorJson") public void testScan_error(String json) { JSONScanner scanner = new JSONScanner(json.toCharArray()); try { scanner.scan(); want.fail(); } catch (Exception e) { String message = e.getMessage(); want.string(message).contains("syntax error"); } } @DataProvider public Object[][] errorJson() { return new Object[][] { { "'-0.3e1234' }" },// <br> { "['key1','key2'] 1" },// <br> { "{key1:'value1'} 1" },// <br> }; } @Test public void testScanString() { String json = "{#class:'[I@123',#value:[1,2]}"; JSONScanner scanner = new JSONScanner(json.toCharArray()); JSONMap map = (JSONMap) scanner.scan(); want.map(map).sizeEq(2); String clazzname = ((JSONSingle) map.get("#class")).toStringValue(); want.string(clazzname).isEqualTo("[I@123"); } /** * 测试以[开头的字符串 */ @Test public void testGetEscapedChar1() { String value = JSON.toObject("\\[xxx]"); want.string(value).isEqualTo("[xxx]"); } /** * 测试以{开头的字符串 */ @Test public void testGetEscapedChar2() { String value = JSON.toObject("\\{xxx}"); want.string(value).isEqualTo("{xxx}"); } }