标签: jackson-modules

将Jackson ObjectMapper类设置为不使用双重科学记数法

我正在为JsonSchema使用库com.fasterxml.jackson库,我正在创建一个IntegerSchema对象,当我使用下面的代码设置整数模式的范围时:

main(){
     IntegerSchema intSchema = new IntegerSchema();
     // setMaximum accepts Double object 
     intSchema.setMaximum(new Double(102000000));
     // setMaximum accepts Double object
     intSchema.setMinimum(new Double(100));

     printJsonSchema(intSchema);
}


public void printJsonSchema(JsonSchema schema){
        ObjectMapper mapper = new ObjectMapper();
        try {
            logger.info(mapper.writeValueAsString(schema));
        } catch (JsonProcessingException e) {
            throw new IllegalStateException(e);
        }
}
Run Code Online (Sandbox Code Playgroud)

当我使用ObjectMapper将IntegerSchema转换为字符串时得到以下响应:

{"type":"integer","maximum":1.02E8,"minimum":100.0}
Run Code Online (Sandbox Code Playgroud)

最大值和最小值将转换为科学计数法.

但是我需要非科学记谱法的输出如下:

{"type":"integer","maximum":102000000,"minimum":100}
Run Code Online (Sandbox Code Playgroud)

我无法更改IntegerSchema类.

请建议如何在不扩展IntegerSchema类的情况下获得所需的输出?

提前致谢

java jsonschema jackson jackson-modules

8
推荐指数
4
解决办法
8741
查看次数

如何映射Mixins以嵌套JSON响应

我使用Jackson API将我的JSON响应映射到java对象.例如,

回复{name:'karthikeyan',年龄:'24',性别:'男'}

@JsonProperty("name")
public String _name;
@JsonProperty("age")
public int _age;
@JsonProperty("gender")
public String _gender;
Run Code Online (Sandbox Code Playgroud)

是Mix-in,它工作得很好.(内部我们将映射这个pojo和Mix-in).现在,我如何在混合中表示以下响应?

{
name :'karthikeyan',
age:'24',
gender:'Male',
interest:
      {
        books:'xxx',
        music:'yyy',
        movie:'zzz'
      }
}
Run Code Online (Sandbox Code Playgroud)

我试过以下,但没有运气.

@JsonProperty("name")
public String _name;
@JsonProperty("age")
public int _age;
@JsonProperty("gender")
public String _gender;

@JsonProperty("interest")
public InterestPojo interestPojo;  //created same format mix-in and pojo for interest params as well.
Run Code Online (Sandbox Code Playgroud)

但无法准确地映射它们,请提出您的意见和想法如何做到这一点?

java json jackson jackson-modules

7
推荐指数
1
解决办法
4898
查看次数

如何确保Spring Boot额外的Jackson模块具有相同的版本?

Spring Boot已经包含核心杰克逊依赖+其他几个.

如果您想要添加org.json或jsr-353数据绑定模块,则可以明确定义这些附加模块的版本.

有没有办法引用其他Jackson模块的相同版本?我想避免任何兼容性问题.

jackson jackson-modules spring-boot

7
推荐指数
2
解决办法
8267
查看次数

杰克逊地图序列化模块

我有一个包含Map(带非String键)和其他一些字段的Class.

public class MyClass() {
    private Map<KeyObject, OtherObject> map;
    private String someField;

    public MyClass(Map<KeyObject, OtherObject> map, String someField) {
        this.map = map;
        this.someField = someField;
    }

    // Getters & Setters
}
Run Code Online (Sandbox Code Playgroud)

我想使用Jackson对这个类进行序列化和反序列化.我看到了不同的方法,并决定尝试使用jackson模块.

我按照这篇文章并扩展了JsonDeserializer和JsonSerializer.问题是应该键入这些类,所以看起来应该是这样的

public class keyDeserializer extends JsonDeserializer<Map<KeyObject, OtherObject>> {
...
}
Run Code Online (Sandbox Code Playgroud)

KeySerializer也是如此.

然后添加到模块:

module.addSerializer(new keySerializer());
module.addDeserializer(Map.class, new keyDeserializer());
Run Code Online (Sandbox Code Playgroud)

但这显然是错误的,因为我得到了一个例外:

keySerializer does not define valid handledType() -- must either register with method that takes type argument  or make serializer extend 'org.codehaus.jackson.map.ser.std.SerializerBase'
Run Code Online (Sandbox Code Playgroud)

我可以将我的序列化器和反序列化器输入MyClass,但后来我必须手动解析所有这些,这是不合理的.

更新:

我设法通过使用注释绕过代码中的模块创建 …

java serialization map jackson jackson-modules

7
推荐指数
1
解决办法
7234
查看次数

Spring MVC配置+ Jackson + Guava多图

我正在努力解决这个问题:

我们有一个带有Guava多重映射的Table类(简化代码,基本上是1个成员,2个构造函数,多重映射的getter和setter):

public class Table {

    private LinkedHashMultimap<String,Field> fields;

    public Table(){
        this.fields = LinkedHashMultimap.create();
    };

    public Table (LinkedHashMultimap<String, Field> fields){
        this.fields= fields;
    }

    public LinkedHashMultimap<String, Field> getFields() {
        return fields;
    }

    public void setFields(LinkedHashMultimap<String, Field> fields) {
        this.fields = fields;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想使用Jackson 2.4.3使用Spring MVC 3.2.11将其序列化.

POM相关的依赖关系是:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.4.3</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.4.3</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-guava</artifactId>
  <version>2.4.3</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>3.2.11.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>3.2.11.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId> …
Run Code Online (Sandbox Code Playgroud)

java spring-mvc multimap guava jackson-modules

7
推荐指数
1
解决办法
3294
查看次数

在android上使用jackson-dataformat-xml

我正在使用android上的jackson-dataformat-xml

我有一些非常基本的代码,可以在oracle jre上正常工作

JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
Run Code Online (Sandbox Code Playgroud)

首先,我尝试了适合gradle的官方文档(由我,不确定是否正确完成):

compile 'com.fasterxml.jackson.core:jackson-core:2.5.4'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.5.4'
compile 'com.fasterxml.jackson.core:jackson-databind:2.5.4'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.5.4'

compile 'org.codehaus.woodstox:woodstox-core-asl:4.4.1'
compile 'javax.xml.stream:stax-api:1.0-2'
Run Code Online (Sandbox Code Playgroud)

结果:gradle将关于将corelibraries捆绑到应用程序中的构建时间失败

...
:app:preDexDebug
trouble processing "javax/xml/stream/EventFilter.class":
Ill-advised or mistaken usage of a core class (java.* or javax.*)
when not building a core library.
...
Run Code Online (Sandbox Code Playgroud)

试图按照肖恩的回答进行第二次尝试 (基本上他用前缀名称重新包装corelibs并重建jackson-dataformat-xml以使用前缀名称)

compile 'com.fasterxml.jackson.core:jackson-core:2.1.2'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.1.2'
compile 'com.fasterxml.jackson.core:jackson-databind:2.1.2'
// Repackaged XML-specific libraries
compile 'edu.usf.cutr.android.xml:jackson-dataformat-xml-android:2.1.2'
compile 'edu.usf.cutr.android.xml:stax2-api-android:3.1.1'
compile 'edu.usf.cutr.android.xml:stax-api-android:1.0-2'
compile 'edu.usf.cutr.android.xml:aalto-xml-android:0.9.8'
Run Code Online (Sandbox Code Playgroud)

复制时构建时间失败

Duplicate files copied in …
Run Code Online (Sandbox Code Playgroud)

java android jaxb jackson jackson-modules

7
推荐指数
1
解决办法
5661
查看次数

更新到 Spring Boot 2 后未注册 Jackson 模块

我正在从 Spring Boot 1.5.21 升级到 2.2.5。

我需要用来MonetaryModule反序列化休息调用,并取决于 Spring 的ObjectMapper.

我在某个@Configuration类(MonetaryModule正在扩展Module)中为此模块定义了这样一个 bean :

@Bean
public MonetaryModule monetaryModule() {
    return new MonetaryModule();
}
Run Code Online (Sandbox Code Playgroud)

我可以在/beans端点中看到它已创建。但是,它实际上并未加载到ObjectMapper. 在对 Spring 的代码进行了大量调试和挖掘之后,我得出的结论是JacksonAutoConfiguration. 它有一个名为的内部静态类JacksonObjectMapperBuilderConfiguration,其中有一个bean创建Jackson2ObjectMapperBuilder. 在创建过程中,有一个调用customize()最终会得到这个代码:

private void configureModules(Jackson2ObjectMapperBuilder builder) {
    Collection<Module> moduleBeans = getBeans(this.applicationContext, Module.class);
    builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
}
Run Code Online (Sandbox Code Playgroud)

这段代码似乎负责将模块加载到 中ObjectMapper,问题是这Jackson2ObjectMapperBuilder实际上并没有被创建。它出现在/beans端点中,但事实上当我在那里断点时我没有到达断点。这解释了为什么模块没有加载到ObjectMapper.

问题是,为什么没有调用这段代码?为什么/bean表明 bean 确实存在?

编辑 …

java jackson jackson-modules spring-boot jackson-databind

7
推荐指数
1
解决办法
1081
查看次数

@JsonPropertyOrder不使用jackson-module-jsonSchema

我正在使用Jackson模块的最新分支 - jackson-module-jsonSchema即2.4.4-Snapshot.

我正在尝试使用@JsonPropertyOrder注释来维护POJO属性的顺序,但它似乎不尊重注释.

我的样本POJO如下 -

import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({"a", "b"})
class Pojo {
    private String a;
    private String b;

    public Pojo(final String a, final String b) {
        this.a = a;
        this.b = b;
    }

    public void setA(final String a) {
        this.a = a;
    }

    public void setB(final String b) {
        this.b = b;
    }

    public String getA() {
        return this.a;
    }

    public String getB() {
        return this.b;
    }
}
Run Code Online (Sandbox Code Playgroud)

杰克逊代码如下 -

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;

public …
Run Code Online (Sandbox Code Playgroud)

java json jsonschema jackson jackson-modules

6
推荐指数
1
解决办法
2494
查看次数

由于jackson-databind版本不匹配导致的序列化错误?

我遇到了以下错误

java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS
    at com.fasterxml.jackson.datatype.joda.ser.DurationSerializer.<init>(DurationSerializer.java:28)
    at com.fasterxml.jackson.datatype.joda.ser.DurationSerializer.<init>(DurationSerializer.java:25)
    at com.fasterxml.jackson.datatype.joda.JodaModule.<init>(JodaModule.java:45)
Run Code Online (Sandbox Code Playgroud)

我检查了看哪些版本的jackson-datatype-joda可用.似乎maven排除了所有版本不匹配.

这可能导致序列化错误的任何其他原因?

serialization maven dropwizard jackson-modules

6
推荐指数
2
解决办法
7241
查看次数

Jackson Object Mapper readvalue以字节为单位返回一个对象,其中所有字段都初始化为null

我正在尝试使用jackson对象映射器将字节数组反序列化为java类型.

    @JsonIgnoreProperties(ignoreUnknown = true)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class A {
     String s;
     String b;
    }

   @JsonIgnoreProperties(ignoreUnknown = true)
   @JsonInclude(JsonInclude.Include.NON_NULL)   
   public class B {
     String c;
     String b;
   }

      @JsonIgnoreProperties(ignoreUnknown = true)
       @JsonInclude(JsonInclude.Include.NON_NULL)   
       public class C {
         List<CustomType> x;
       }
Run Code Online (Sandbox Code Playgroud)

并使用杰克逊方法,

objectMapper.readValue(byte[] data, Class<T> type).
Run Code Online (Sandbox Code Playgroud)

因为我不确定字节数组包含什么对象,所以当它无法创建指定类型的对象时,我希望它失败.但是,objectMapper返回一个对象,其所有字段都初始化为null.我该如何避免这种行为?

Ex: 
byte[] b; //contains Class B data
byte[] a; //contains Class A data
byte[] c// contains Class C data
A a = objectMapper.readValue(c, A.class) is returning 
{s=null, b = null}
Run Code Online (Sandbox Code Playgroud)

这是我配置了ObjectMapper,

@Bean
    public ObjectMapper …
Run Code Online (Sandbox Code Playgroud)

java json jackson jackson-modules

5
推荐指数
1
解决办法
3065
查看次数