我有一个输入文件(“student.json”),其中包含几行 JSON 代码,例如:
{"name":"Josh","age":22,"gender":"M"}
将在 Java 程序中使用。程序应该输入文件,抓取一个 JSON 字符串,然后使用字符堆栈来验证语法(程序应该忽略特定属性 [name] 和值 [Josh] 是什么,但知道每组大括号必须具有至少 2 个值,其间用冒号分隔)。如果语法正确,控制台将告诉用户 JSON 字符串有效,如果无效,控制台将如此说明。
对于字符堆栈,我将循环遍历 JSON 字符串的每个字符。当遇到左大括号或方括号时,程序应将其插入堆栈。当遇到右大括号或中括号时,程序应该从堆栈中弹出一个值并查看它是否匹配。我还应该使用 isEmpty 方法来查看是否存在不匹配的符号。
我以前从未使用过字符堆栈。我知道如何执行 Java 程序的其余部分,这只是我陷入困境的堆栈。
问题:如何使用此字符堆栈和要求验证 JSON 字符串?
最佳答案
堆栈基本上就是这个接口(interface):
public interface Stack<T> {
void push(T item); // adds an item to the stack
T peek(); // looks what is the last item in the stack
T pop(); // removes and returns the last item of the stack
boolean isEmpty(); // are there items in the stack?
}
这不是漂亮的代码,但这里有一个解决您的问题的示例(使用内置的 java.util.Stack
类):
public static boolean isValid(String str) {
Stack<Character> stack = new Stack<>();
for (char c : str.toCharArray()) {
switch (c) {
case '{':
stack.push(c);
break;
case '}':
if (stack.isEmpty()) {
return false;
}
Character last1 = stack.pop();
if (last1 != '{') {
return false;
}
break;
case '\"':
if (stack.isEmpty()) {
return false;
}
Character last2 = stack.peek();
if (last2 == '\"') {
// It's a closing quote
stack.pop();
} else {
// It's an opening quote
stack.push(c);
}
break;
}
}
return stack.isEmpty();
}
通过测试:
@Test public void isValid_if_true() {
String jsonString = "{\"name\": \"John\"}";
assertTrue(JsonValidator.isValid(jsonString));
}
@Test public void isValid_if_too_many_opened_brackets() {
String jsonString = "{\"name\": \"John\", {}";
assertFalse(JsonValidator.isValid(jsonString));
}
@Test public void isValid_if_too_many_closed_brackets() {
String jsonString = "{\"name\": \"John\", }}";
assertFalse(JsonValidator.isValid(jsonString));
}
@Test public void isValid_if_too_many_quotes() {
String jsonString = "{\"name\": \"\"John\"}";
assertFalse(JsonValidator.isValid(jsonString));
}
您仍然需要检查 JSON 对象中是否至少有 2 个属性,并验证 ,
的位置。
尝试在纸上演示该算法,看看它是如何工作的。
基本上我们忽略除了括号和引号之外的所有字符。当我们得到这些特殊字符之一时,我们检查它们是否正在打开一个新的“ token ”(压入堆栈)、关闭一个新的“ token ”(从堆栈中弹出)或者是否存在问题。
希望对您有所帮助。
关于java - 如何在 Java 中使用字符堆栈验证 JSON 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911158/