java - 如何在 Java 中使用字符堆栈验证 JSON 语法?

标签 java json string validation

我有一个输入文件(“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/

相关文章:

java - Google Cloud Function可自动创建Windows vm密码

json - Angular 5,rxjs 映射到 json,类型“对象”上不存在 'json'

java - 如何检查 GSON 元素的空值?

java - 循环字符串替换

java - 在运行时创建带有注释字段的 java 类

java - 我如何找到并计算这里有多少特定类型的空格?

java - 显式等待在 Selenium Webdriver 中不起作用

c# - 从 jQuery 调用的 WCF 服务返回列表<字符串>

java - 如何使用异常读取除字符串之外的其他内容?

string - 将 Vec<String> 作为 IntoIterator<&'a str> 传递