Tag: jackson

jackson序列化:如何忽略超类属性

我想序列化一个不受我控制的POJO类,但是想要避免序列化来自超类的任何属性,而不是序列化来自最终类的属性。 例: public class MyGeneratedRecord extends org.jooq.impl.UpdatableRecordImpl, example.generated.tables.interfaces.IMyGenerated { public void setField1(…); public Integer getField1(); public void setField2(…); public Integer getField2(); … } 您可以从示例中猜测此类是由JOOQ生成的,并且inheritance自复杂的基类UpdatableRecordImpl,它还具有一些类似于bean属性的方法,这会在序列化期间导致问题。 此外,我有几个类似的类,因此最好避免为我生成的所有POJO重复相同的解决方案。 到目前为止,我找到了以下可能的解决方案: 使用mixin技术忽略来自超类的特定字段,如下所示: 如何告诉jackson忽略我无法控制源代码的属性? 这个问题是如果基类发生变化(例如,新的getAnything()方法出现在它中),它可能会破坏我的实现。 实现自定义序列化程序并在那里处理问题。 这对我来说似乎有点矫枉过正。 顺便说一下,我有一个接口,它描述了我想要序列化的属性,也许我可以混合一个@JsonSerialize(as = IMyGenerated.class)注释……? 我可以将此用于我的目的吗? 但是,从纯粹的设计角度来看,最好的方法是能够告诉jackson我只想序列化最终类的属性,并忽略所有inheritance的属性。 有没有办法做到这一点? 提前致谢。

如何使用MongoDb中的jackson将Date字段存储为ISODate()

我试图使用fastxml jackson在mongo集合中持久保存java.util.Date字段的java对象。 问题是objectMapper的默认性质是将Date存储为NumberLong类型。 例如, java.util.Date类型的createdTime字段存储如下: “createdTime” : NumberLong(“1427728445176″) 我想将它存储在mongo Shell中可用的ISODate格式中。 现在,我知道有办法格式化对象映射器以将日期存储在字符串dateformat中。 但我只是在寻找ISODate()格式。 例如”createdTime” : ISODate(“2015-01-20T16:39:42.132Z”) 有没有办法做到这一点 ? 请告知大师。 在此先感谢您的帮助。

我在哪里指定Spring 3.1中的Jackson SerializationConfig.Feature设置

我很困惑为什么使用默认包含的jackson,Spring似乎已经定制了默认的Jackson配置。 其中一个设置就是WRITE_DATES_AS_TIMESTAMPS , jackson的默认值是true但是Spring在某处将此更改为false并且还提供了日期格式。 世界在哪里发生这种情况? 我希望我的日期保持序列化为数字。 更新 :事实certificate它不是导致问题的弹簧,它实际上是hibernate导致问题的代理类。 出于某种原因,如果hibernate具有type=”date”的类型映射,它将序列化为日期字符串,但如果其type=”timestamp” ,则按预期序列化。 而不是花太多时间研究这个,我决定暂时改变我的所有映射到时间戳。

在一个字段中反序列化多个类型的JSON

我想反序列化JSON(使用Jackson 1.9.11和RestTemplate 1.0.1),其中一个字段可能具有更多的类型含义,例如: {“responseId”:123,”response”:”error”} 要么 {“responseId”:123,”response”:{“foo”:”bar”, … }} 一个或其他案例可以使用一个特定类型的setter(String od自定义Response类)正常工作,但是当我放入我的实体bean覆盖setter以便能够处理这两种情况时,抛出exception: Caused by: org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [xxxx.templates.ExportResponse] and content type [application/json;charset=utf-8] 我在考虑三种解决方案,但我没有让它们工作: 只使用String setter和内部使用ObjectMapper解组该字符串,如果它不等于“error”,但是当JS Array出现时,它不是字符串所以不使用String setter :(。 使用多态类型处理(@JsonTypeInfo注释)与自己的JsonDeserializer扩展 – 我仍然试图理解这一点并实现。 创建HttpMessageConverter列表并放入所有消息转换器,我可以使用。 但我认为这一步是不必要的,因为只使用MappingJacksonHttpMessageConverter,我是对的吗? 编辑:它现在如何工作 实体bean中的setter: @JsonDeserialize(using = ResponseDeserializer.class) public void setResponse(Object responseObject) { if(responseObject instanceof Response) response = […]

如何阻止Jackson序列化多态类型的注释属性?

我有多态类型和反序列化从JSON到POJO的工作。 事实上,我遵循了这里的文档。 将POJO序列化为JSON时,我得到了一个不需要的属性,特别是逻辑类型名称。 import static org.codehaus.jackson.annotate.JsonTypeInfo.*; @JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property=”type”) @JsonSubTypes({ @JsonSubTypes.Type(value=Dog.class, name=”dog”), @JsonSubTypes.Type(value=Cat.class, name=”cat”) }) public class Animal { … } public class Dog extends Animal { … } public class Cat extends Animal { … } 当Jackson序列化为JSON时,它提供了我不想公开的类型信息。 {“type”:”dog”, … } {“type”:”cat”, … } 能以某种方式阻止这种情况吗? 我只想在反序列化时忽略type 。

在JSON对象中强制执行非空字段

我们的REST API接收一些JSON对象输入,其中某些字段必须不为null。 这些可以是String / Integer,也可以是其他类实例作为引用。 我们试图找到一种方法来强制这些字段不为空,而不是在api中进行空检查的正确方法。 当前: if(myObject.getSomeOtherObject()== null) 抛出新的SomeException(); 我们想拥有的是: class MyObject { @需要 OtherObject someOtherObject; … } 我们尝试了3件事: 升级到jackson 2.0.6并使用注释com.fasterxml.jackson.annotation.JsonProperty但是,这看起来不起作用。 找到了这些参考文献: http : //jira.codehaus.org/browse/JACKSON-767 扩展JsonDeserializer以检查null但问题是它甚至没有在null输入上执行。 public class NotNullDeserializer extends JsonDeserializer { @覆盖 public T反序列化(JsonParser jsonparser,DeserializationContext deserializationcontext)抛出IOException,JsonProcessingException { ParameterizedType superClass =(ParameterizedType)getClass()。getGenericSuperclass(); 类类型=(类)superClass.getActualTypeArguments()[0]; T t = jsonparser.readValueAs(type); if(t == null){ String classNameField = type.getName(); String […]

jackson的JSON View课程是什么?它是如何工作的?

我不明白Jackson的@JsonView( Views.MyClass.class )是什么。 我知道我可以通过这种方式对 POJO的字段和方法进行注释,以过滤使用JSON序列化的非注释的字段和方法。 但什么是Views.Myclass类? 它是jackson图书馆的模板类吗? 为什么Views类中有很多类? 例如这样: class Views { static class Public { } static class ExtendedPublic extends PublicView { } static class Internal extends ExtendedPublicView { } } 为什么需要它以及它如何工作?

JSON:JsonMappingException尝试反序列化具有空值的对象

我尝试反序列化包含null属性的对象并具有JsonMappingException 。 我做的事: String actual = “{\”@class\” : \”PersonResponse\”,” + ” \”id\” : \”PersonResponse\”,” + ” \”result\” : \”Ok\”,” + ” \”message\” : \”Send new person object to the client\”,” + ” \”person\” : {” + ” \”id\” : 51,” + ” \”firstName\” : null}}”; ObjectMapper mapper = new ObjectMapper(); mapper.readValue(new StringReader(json), PersonResponse.class); //EXCEPTION! 但是 […]

Jackson – 自定义序列化程序,仅覆盖特定字段

我知道如何在Jackson中使用自定义序列化程序(通过扩展JsonSerializer ),但我希望默认的序列化程序适用于所有字段,除了1个字段,我想使用自定义序列化程序覆盖它。 注释不是一个选项,因为我正在序列化生成的类(来自Thrift)。 在编写自定义jackson序列化程序时,如何仅指定要覆盖的某些字段? 更新: 这是我要序列化的类: class Student { int age; String firstName; String lastName; double average; int numSubjects // .. more such properties … } 上面的类有很多特性,大多数都使用本机类型。 我想覆盖自定义序列化程序中的一些属性,让Jackson像往常一样处理其余的属性。 例如,我只想将“年龄”字段转换为自定义输出。

尝试在java中使用Jackson时出现问题

我正在尝试使用Jackson将一些JSON数据转换为Java对象,这是一个精确的对象列表,但是我收到了这个错误: org.codehaus.jackson.map.JsonMappingException:无法从START_ARRAY标记反序列化entitylayer.Detail的实例 这是代码: ObjectMapper mapper = new ObjectMapper(); List lcd = (List) mapper.readValue(ld, Detail.class); ld是Json格式的列表,这是让我在jackson教程中融入的部分。 新文件(“user.json”)代表什么? 我假设那是我想要转换的json格式的字符串,这就是我使用ld的原因。 我希望你能帮助我