Spring 4 Jackson阵列映射

时间:2015-09-23 21:35:20

标签: java spring spring-mvc jackson

我是Spring 4中的新手,我遇到了问题。 Mabye有人知道如何帮助我。

这个JSON不起作用,我得到了

  

异常是com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT标记中反序列化java.util.ArrayList的实例

{
"placeAnOrder": {
    "customer": {
        "name": "adas",
        "surname": "asdasd",
        "street": "asd",
        "homeNr": "ada",
        "phone": "123123"
    },
    "orders": {
        "order": {
            {
                "orderId": "1231",
                "dateOrder": "2015-09-09 12:12:12",
                "products": {
                    "product": [
                        {
                            "productId": "34234",
                            "price": "23423",
                            "quantity": "2"
                        }
                    ]
                }
            }
        }
    }
}

}

这个JSON运行良好。

{
"placeAnOrder": {
    "customer": {
        "name": "adas",
        "surname": "asdasd",
        "street": "asd",
        "homeNr": "ada",
        "phone": "123123"
    },
    "orders": {
        "order": [
            {
                "orderId": "1231",
                "dateOrder": "2015-09-09 12:12:12",
                "products": {
                    "product": [
                        {
                            "productId": "34234",
                            "price": "23423",
                            "quantity": "2"
                        }
                    ]
                }
            }
        ]
    }
}

}

在第一个JSON中,我有一个Order列表元素,但表示为{}而不是[]。第二,我有[]。 当我添加这个

时,我发现我可以处理这个第一个JSON
<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" />
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="jacksonObjectMapper" />
    <property name="targetMethod" value="configure" />
    <property name="arguments">
        <list>
            <value type="com.fasterxml.jackson.databind.DeserializationFeature">ACCEPT_SINGLE_VALUE_AS_ARRAY</value>
            <value>true</value>
        </list>
    </property>
</bean>

<mvc:annotation-driven>
    <mvc:message-converters>
        <!-- Jackson converter for HTTP messages -->
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="jacksonObjectMapper" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

我将此添加到我的servlet.xml(除此之外我还有web.xml和applicationContext.xml)但它不起作用。我使用 fasterxml.jackson v.2.6.2

1 个答案:

答案 0 :(得分:1)

JSON语法要求数组包含在方括号内,而不是花括号。根据{{​​3}}:

  

数组是有序的值集合。数组以[(左括号)开头,以]结尾(右括号)。值以(逗号)分隔。

默认情况下,Jackson使用严格的解析,因此抛出JsonMappingException,因为数组是作为括号而不是方括号。

将以下内容添加到servlet.xml时,它会告诉Jackson将单个对象视为可与Java集合一起使用的数组:

<value type="com.fasterxml.jackson.databind.DeserializationFeature">ACCEPT_SINGLE_VALUE_AS_ARRAY</value>

根据杰克逊的文件:

  

public static final DeserializationFeature ACCEPT_SINGLE_VALUE_AS_ARRAY

     

确定是否可以强制使用非数组(在JSON中)值以使用Java集合(数组,java.util.Collection)类型的功能。如果启用,集合反序列化器将尝试处理非数组值,就像它们具有围绕JSON数组的“隐式”一样。此功能旨在用于兼容性/互操作性的原因,以便在数据库中只有一个元素的情况下使用会丢弃JSON数组的包(例如XML-to-JSON转换器)。

     

默认情况下禁用功能。