标签: jackson-modules

跳过格式错误的CSV行

我一直在尝试读取csv并将字段添加到数据结构中。但是,其中一行的格式不正确,我知道这一点。我只想跳过这一行,然后转到另一行。但是,即使我捕获到异常,它仍在中断循环。知道我在这里缺少什么吗?

我的csv:

"id","name","email"
121212,"Steve","steve@example.com"
121212,"Steve","steve2@example.com",,
121212,"Steve","steve@example.com"
Run Code Online (Sandbox Code Playgroud)

我的代码:

import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;

public static void main(String[] args) throws Exception{
    Path path = Paths.get("list2.csv");
    CsvMapper mapper = new CsvMapper();
    CsvSchema schema = CsvSchema.emptySchema().withHeader();
    MappingIterator<Object> it = mapper.reader(Object.class)
            .with(schema)
            .readValues(path.toFile());

    try{
        while(it.hasNext()){
            Object row;
            try{
                row = it.nextValue();
            } catch (IOException e){
                e.printStackTrace();
                continue;
            }
        }
    } catch (ArrayIndexOutOfBoundsException e){
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

例外:

com.fasterxml.jackson.core.JsonParseException: Too many entries: expected at most 3 (value #3 (0 chars) "")
 at [Source: java.io.InputStreamReader@12b3519c; line: …
Run Code Online (Sandbox Code Playgroud)

java csv jackson jackson-modules

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

使用Jackson将Java对象实例写入YAML

我有一个'示例'Pojo类,如下所述.任何一个tel都可以使用Jackson将Example类的实例保存到YAML文件中.

public class Example {

String name;
int value;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}
Run Code Online (Sandbox Code Playgroud)

}

java yaml jackson jackson-modules jackson2

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

为什么 Jackson Streaming API 很慢?

根据 Jackson Streaming API 文档:

如果您明确重写所有转换以使用 Streaming API 而不是数据绑定,您可能能够将吞吐量提高 30-40%;这对实际生成的 JSON 没有任何更改。

阅读全文:https : //github.com/FasterXML/jackson-docs/wiki/Presentation : -Jackson-Performance

但是,根据我的基准测试,在最佳情况下吞吐量提高了 15-20%,对于写入复杂对象,甚至降低了约 23%。

难道我做错了什么?为什么使用流式 api 的复杂对象的写入操作比使用在流式 api 之上工作的 ObjectMapper 慢?

非常有趣的是,对于 java11/12,Jackson Streaming 的写入性能下降更为显着(约 2% 相比于 Java 11/12 的约 24%)。

配置:

  • 8个CPU
  • 64 GB 内存
  • 操作系统版本 16.04.1 LTS (Xenial Xerus)
  • Docker 版本 18.03.0-ce,构建 0520e24

JMH 吞吐量结果:

  • 预热:10 次迭代,每次 10 秒
  • 测量:10 次迭代,每次 10 秒
  • 线程:1 个线程,将同步迭代
  • 虚拟机选项:-XX:+UseG1GC -server -Xmx4096m -Xms4096m
  • 单位:操作数/秒

复杂对象

大对象 json 对象大小 ~ 52KB

普通对象

小物体 json 对象大小 ~ 72B

结构: …

java jackson jackson-modules jmh java-11

5
推荐指数
0
解决办法
1422
查看次数

@JsonCreator 和 mixin 通过模块不适用于第 3 方类

我正在尝试反序列化 java.net.HttpCookie,它没有默认的无参数构造函数,并且得到: org.codehaus.jackson.map.JsonMappingException:找不到类型 [简单类型,类 java.net. HttpCookie]:无法从 JSON 对象实例化(需要添加/启用类型信息?),位于 [来源:java.io.StringReader@5a395674;行:1,列:35

这是与 jackson-mapper-asl v 1.9.13 一起使用的

我发现Jackson 3rd Party Class With No Default Constructor并尝试通过 getDeserializationConfig 和 using 模块使用他们的解决方案。我在下面展示了模块代码。

abstract class HttpCookieMixIn {
    @JsonCreator
    public HttpCookieMixIn(@JsonProperty("name") String name, @JsonProperty("value") String value) {
        logger.info("Mixin called!");
    }
}

public class MyModule extends SimpleModule {
    public MyModule() {
        super("ModuleName", new Version(0,0,1,null));
    }

    @Override
    public void setupModule(SetupContext context) {
        context.setMixInAnnotations(java.net.HttpCookie.class, HttpCookieMixIn.class);
        logger.info("Set mixin annotation");
    }
}
Run Code Online (Sandbox Code Playgroud)

在服务器端点的构造函数中,我有以下内容:

public ServerEndpointConstructor() {
    mapper = new ObjectMapper();
    mapper.registerModule(new …
Run Code Online (Sandbox Code Playgroud)

java json jackson jackson-modules

4
推荐指数
1
解决办法
6633
查看次数

在 Jax-RS 应用程序中注册 JodaModule

我正在使用 Jersey 和 Jackson2 编写一个 Jax-RS 应用程序,以促进 JSON i/o。该服务本身运行良好,但我想通过让 Jackson 映射器自动将日期和日期时间序列化/反序列化为 JodaTime 对象来改进它。

我正在关注此处的文档并添加了相关的 jars,但我对这条指令迷失了:

Registering module

To use Joda datatypes with Jackson, you will first need to register the module first (same as with all Jackson datatype modules):

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
Run Code Online (Sandbox Code Playgroud)

我尝试在扩展 jax.ws.rs.core.Application 的自定义类中执行此操作,但我对该解决方案完全没有信心。我目前收到此错误:

Can not instantiate value of type [simple type, class org.joda.time.DateTime] from String value ('2014-10-22'); no single-String constructor/factory method
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@3471b6d5; line: 7, column: 25]
Run Code Online (Sandbox Code Playgroud)

除了这个模块注册需要在应用程序(servlet?)启动时发生的一般印象之外,我不知道如何处理这些信息。我是否需要用特别的东西来注释自定义类才能让它被选中?我应该扩展一些课程吗?

我在 StackOverflow 上找到的示例通常会将其粘贴 …

jax-rs jackson jersey-2.0 jackson-modules

4
推荐指数
1
解决办法
2270
查看次数

如何在Spring Boot中注册和使用jackson AfterburnerModule?

我正在使用SpringBoot 1.5.9,Jackson 2.8和Spring Framework 4.3.13。

我正在尝试注册和使用AfterburnerModel。

根据Spring Boot文档,要配置ObjectMapper,您可以自己定义bean并用@Bean和@Primary对其进行注释。在bean中,您可以注册一个模块。或者,您可以添加类型为Jackson2ObjectMapperBuilder的bean,在其中可以通过添加模块来自定义ObjectMapper。

我尝试了两种方式,并且在序列化期间,杰克逊模块加力燃烧器中没有断点。我的自定义设置已被阅读,但似乎被忽略了。

java spring jackson jackson-modules spring-boot

4
推荐指数
1
解决办法
3435
查看次数

Java 8 Time API的ObjectMapper配置

我们正在从Joda迁移到Java Time.目前我们DateTime在我们的实体中使用Joda.AFAIK DateTime相当于Java中的两种类型:OffsetDateTime和ZonedDateTime.既然我们要将它们保存在数据库中,我们将使用OffsetDateTime(对此有何评论?).

现在的问题是如何ObjectMapper正确配置杰克逊.我在网上找到的所有例子都是关于Jackson已经提供de/serializer实现的本地类型(例如LocalDateTime,LocalDateTimeSerializer和LocalDateTimeDeserializer).

我终于设法做了这样的事情:

public class OffsetDateTimeSerializer extends StdSerializer<OffsetDateTime> {

    private final DateTimeFormatter formatter; // We need custom format!

    public OffsetDateTimeSerializer(DateTimeFormatter formatter) {
        super(OffsetDateTime.class);
        this.formatter = formatter;
    }

    @Override
    public void serialize(OffsetDateTime value, JsonGenerator generator, SerializerProvider provider) throws IOException {
        generator.writeString(value.format(formatter));
    }

}
Run Code Online (Sandbox Code Playgroud)

和

public class OffsetDateTimeDeserializer extends StdDeserializer<OffsetDateTime> {

    private final DateTimeFormatter formatter; // We need custom format!

    public OffsetDateTimeDeserializer(DateTimeFormatter formatter) …
Run Code Online (Sandbox Code Playgroud)

java jackson jackson-modules java-time jackson-databind

4
推荐指数
2
解决办法
1560
查看次数

即使在添加 jackson-modules-java8 依赖项后也找不到 Jackson JavaTimeModule?

我正在尝试遵循JDK8 java.time 是否有 jackson 数据类型模块中给出的解决方案?(这是这个问题的原因,而不是重复)。

我加了

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-modules-java8</artifactId>
    <version>2.9.5</version>
    <type>pom</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但我仍然无法做到这一点:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
Run Code Online (Sandbox Code Playgroud)

该JavaTimeModule班是无处可寻。我究竟做错了什么?

java jackson jackson-modules jackson-databind

4
推荐指数
1
解决办法
4817
查看次数

Jackson Kotlin - 反序列化 JsonNode

问题

我有字符串形式的 JSON 内容,我首先想用 Jackson 以编程方式遍历它。然后,当我有感兴趣的节点时,我想反序列化它。

我尝试过的

我已使用 mapper.readValue 成功反序列化字符串,但现在我想在 jsonNode 而不是字符串上执行此类操作。

图书馆

  • 杰克逊核心:2.9.9
  • 杰克逊模块 kotlin:2.9.9
  • 科特林 1.3.41
  • kotlin-stdlib-jdk8:1.3.41

代码

package somepackage

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.readValue
import com.fasterxml.jackson.module.kotlin.treeToValue

fun main() {
    val mapper = ObjectMapper().registerModule(KotlinModule())

    readValueWorksFine(mapper)
    treeToValueFails(mapper)
}

fun treeToValueFails(mapper: ObjectMapper) {
    val fullJsonContent = """
            [{
                    "product_id":123, 
                    "Comments":
                        [{
                            "comment_id": 23, 
                            "message": "Hello World!"
                        }]
            }]        
        """.trimIndent()

    // Traverse to get the node of interest
    val commentsNode: JsonNode = mapper.readTree(fullJsonContent).get(0).get("Comments")

    // Deserialize
    val comments: List<Comment> …
Run Code Online (Sandbox Code Playgroud)

json jackson kotlin json-deserialization jackson-modules

4
推荐指数
1
解决办法
1万
查看次数

Spring 和 MappingJackson2HttpMessageConverter 和 registerModule

我们正在使用最新的 Spring 4.2.x,最近从 Jackson Mapper 2.6.3 升级到 2.8.8,现在我们正在注册模块。

\n\n

这是 spring-servlet.xml 的一部分:

\n\n
<mvc:annotation-driven>\n    <mvc:message-converters register-defaults="true">\n        <bean\n            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">\n            <property name="objectMapper">\n                <bean class="com.fasterxml.jackson.databind.ObjectMapper">\n                    <property name="dateFormat">\n                        <bean class="java.text.SimpleDateFormat">\n                            <constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>\n                        </bean>\n                    </property>\n                </bean>\n            </property>\n        </bean>\n    </mvc:message-converters>\n</mvc:annotation-driven>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我们在代码中映射 json 文件的内容:

\n\n
\xe2\x80\x82   ObjectMapper mapper = new ObjectMapper();\n    mapper.registerModule(new ParameterNamesModule());\n    mapper.registerModule(new Jdk8Module());\n    mapper.registerModule(new JavaTimeModule());\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,我想做的是配置“spring-servlet”和“MappingJackson2HttpMessageConverter”,以便我可以添加要注册的模块。

\n\n

是的,我们还没有开始使用@Configuration,我们仍在使用XML,我根本不介意。

\n\n

谢谢你的帮助!

\n

java spring json spring-mvc jackson-modules

3
推荐指数
1
解决办法
4489
查看次数