意外的输入结束:使用杰克逊解析Json

时间:2018-11-26 21:06:02

标签: json jackson

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

DatabaseConfiguration是带有两个变量Name和Value的pojo类 我需要使用杰克逊解析器进行解析。

  

Exception:com.fasterxml.jackson.core.JsonParseException:意外   输入结束:ARRAY的预期结束标记(来自[来源:[;行:   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 个答案:

答案 0 :(得分:1)

我无法复制确切的异常,但是在Java类和json对象中确实看到了命名约定问题。您未遵循骆驼套,这肯定会导致错误的字段映射,因此会导致与您面临的解析异常不同的解析异常。

我刚刚对您的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\" } ]"