我有一个类需要使用杰克逊进行反序列化,并且该类具有collection属性。集合为空,但不为null。问题:如何在 没有 空集合的 情况下
反序列化类。下面的示例代码:
class Person
{
String name;
List<Event> events;
//....getter, setter
}
如果
person.list = new List<Event>();
persion.name = "hello";
那么json除外:
{name: "hello"}
不
{name: "hello", events:[]}
怎么做?谢谢~~
================================================
我已经通过n1ckolas的建议解决了这个问题。先谢谢你 我的杰克逊版本是2.1.1,而Spring-3.2.2对此杰克逊版本提供了更好的支持。同样,这对
数组和集合都适用。 以下是我的配置:
<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--Json Mapper-->
<bean name="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" autowire="no">
<property name="featuresToDisable">
<list>
<!--not to return empty colletion-->
<value type="com.fasterxml.jackson.databind.SerializationFeature">WRITE_EMPTY_JSON_ARRAYS</value>
</list>
</property>
</bean>
如果可以使用Jackson注释更改原始模型,则可以通过以下方法实现此目的。
杰克逊有WRITE_EMPTY_JSON_ARRAYS。您可以通过以下方式将其关闭:
objectMapper.configure(SerializationConfig.Feature.WRITE_EMPTY_JSON_ARRAYS, false);
但这仅适用于Arrays
,但不适用于Collections
。但您可以将@JsonProperty
与结合使用@JsonIgnore
,如下所示:
//....getter, setter of Person class
@JsonIgnore
public List<Event> getEvents() {
return events;
}
@JsonProperty("events")
public Event[] getEventsArr() {
return events.toArray(new Event[0]);
}
然后,您将得到预期的输出。
编辑 :如果您使用的是SpringMVC,则可以ObjectMapper
在mvc:annotation- driven
以下位置使用显式引用配置实际值:
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="objectMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--custom Json Mapper configuration-->
<bean name="objectMapper" class="org.springframework.http.converter.json.JacksonObjectMapperFactoryBean" autowire="no">
<property name="featuresToDisable">
<list>
<!--Ignore unknown properties-->
<value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_EMPTY_JSON_ARRAYS</value>
</list>
</property>
</bean>
Offtop: 通常,指定的显式实例非常有用ObjectMapper
,因为:
@Autowired
问题内容: 我有一个JSON字符串,将标记为而不是。因此,例如,如果我有一个没有子对象的对象,我将收到类似以下的字符串: 我想将其反序列化为Parent类,并将子级正确设置为一个空的子级列表。 对于上述JSON字符串,我想要一个对象,其设置为,而设置为。 我会知道如何在整个课堂上使用注释 然后 但是,我想解决一个从字符串正确实例化List的一般问题: 我能得到类似的东西吗? 问题答案: 几个选择;
我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似
问题内容: 使用以下代码,我已将列表转换为json,但格式如下: 但我想将其转换为: 以下是我的弹簧控制器: 问题答案: 更改从返回结果给放: 如此; 更新 您可以将结果作为字符串返回,您将获得所需的内容: 返回的字符串是json格式。
问题内容: 我有这个回应: 然后,我要基于 exercise_type 属性实例化不同的对象实例(的子类),因此我在以下位置创建此混合: 所以我创建如下 我的测试: 问题在于,由于某种原因,用作属性on 的 exercise_type 属性被映射为 null 。知道我该如何解决吗? 问题答案: 最后,我在API文档中找到了解决方案 关于类型标识符可见性的注意事项:默认情况下,类型标识符的反序列化(
问题内容: 我正在创建具有嵌套列表的API。杰克逊似乎是创建对象的好工具,但我还不太清楚如何嵌套列表,我想知道它是否可能。 我的对象看起来像这样。 我希望有一种将其映射到看起来像这样的json的方法: 我们希望能够做到这一点,因此我们可以将属性添加到列表中。 问题答案: 您可以为编写自定义解串器。请参见以下示例: 现在,您必须通知Jackson将其用于您的财产。您可以通过以下方式执行此操作:
我试图让下面的例子工作: 然而,它失败了 从这个答案中,我尝试了类似这样的做法: 但这失败了: 由于我正在处理的项目的限制,我无法修改对象映射器。所以我不能简单地做: 这本来是可行的。 还有其他简单的方法可以让ImmutableList反序列化工作吗? 编辑:我设法得到了一个不同的错误,如下所示: 这引发了: 如果我可以为ImmutableListDeserializer或类似的东西构建一个无参数