代码之家  ›  专栏  ›  技术社区  ›  nad87563

意外的输入结束:使用Jackson分析JSON

  •  0
  • nad87563  · 技术社区  · 6 年前

    我正在尝试读取数据库配置详细信息,我正在使用Jackson映射器分析JSON字符串,并将异常作为意外的输入结束:数组的预期结束标记。

    DatabaseConfiguration是一个具有两个变量名和值的POJO类 我需要用杰克逊解析器来解析这个。

    异常:com.fasterxml.jackson.core.jsonParseException:意外 输入结束:数组的预期结束标记(来自[源:;行: 1,专栏:0) 在[源:;行:1,列:3]

    JsonString:

    [
        {
            "Name": "driverclass", 
            "Value": "com.mysql.jdbc.Driver"
        }, 
        {
            "Name": "password", 
            "Value": "abc"
        }, 
        {
            "Name": "url", 
            "Value": "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false"
        }, 
        {
            "Name": "username", 
            "Value": "abc"
        }
    ]
    

    还尝试了json字符串:

     [ { "Name": "jdbc.connection.driver_class", "Value": "com.mysql.jdbc.Driver" }, { "Name": "password", "Value": "abc" }, { "Name": "url", "Value": "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false" }, { "Name": "username", "Value": "abc" } ]
    

    代码:

    import java.io.IOException;
    import java.util.List;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.type.TypeFactory;
    
    public class Parser {
    
        private static void parseJson(String dbConnectionValues) {
    
            try {
    
                List<DatabaseConfiguration> list = new ObjectMapper().readValue(dbConnectionValues,
                        TypeFactory.defaultInstance().constructCollectionType(List.class, DatabaseConfiguration.class));
    
                for (DatabaseConfiguration l : list) {
                    String key = l.getName();
                    String value = l.getValue();
                    System.out.println("key:" + key + "value:" + value);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
        public static void main(String[] args) {
            String jsonString = args[0];
            parseJson(jsonString);
        }
    
    }
    
    
    
       @JsonIgnoreProperties(ignoreUnknown = true)
    public class DatabaseConfiguration {
    
        String name;
        String value;
    
        @JsonProperty("Name")
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @JsonProperty("Value")
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Amith Kumar    6 年前

    我无法复制您的异常,但我确实看到在Java类和JSON对象中命名约定问题。您没有遵循camel大小写,这肯定会导致不正确的字段映射,因此会导致与您所面对的解析异常不同的解析异常。

    我刚刚对JSON字符串&dbconfig类进行了这些更改,并且成功地运行了代码。

    class DatabaseConfiguration {
    
        String name;
        String value;
    
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
    }
    
    
    String testJson = "[{\"name\":\"driverclass\",\"value\":\"com.mysql.jdbc.Driver\"},{\"name\":\"password\",\"value\":\"abc\"},{\"name\":\"url\",\"value\":\"jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false\"},{\"name\":\"username\",\"value\":\"abc\"}]";
    
    
    [
       {
          "name":"driverclass",
          "value":"com.mysql.jdbc.Driver"
       },
       {
          "name":"password",
          "value":"abc"
       },
       {
          "name":"url",
          "value":"jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false"
       },
       {
          "name":"username",
          "value":"abc"
       }
    ]
    

    您的命令行json输入字符串应该如下所示,用双引号括起来:

    "[ { \"Name\": \"jdbc.connection.driver_class\", \"Value\": \"com.mysql.jdbc.Driver\" }, { \"Name\": \"password\", \"Value\": \"abc\" }, { \"Name\": \"url\", \"Value\": \"jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false\" }, { \"Name\": \"username\", \"Value\": \"abc\" } ]"