我一直在尝试读取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) 我有一个'示例'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)
}
根据 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%)。
配置:
JMH 吞吐量结果:
复杂对象
普通对象
结构: …
我正在尝试反序列化 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) 我正在使用 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 上找到的示例通常会将其粘贴 …
我正在使用SpringBoot 1.5.9,Jackson 2.8和Spring Framework 4.3.13。
我正在尝试注册和使用AfterburnerModel。
根据Spring Boot文档,要配置ObjectMapper,您可以自己定义bean并用@Bean和@Primary对其进行注释。在bean中,您可以注册一个模块。或者,您可以添加类型为Jackson2ObjectMapperBuilder的bean,在其中可以通过添加模块来自定义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) 我正在尝试遵循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班是无处可寻。我究竟做错了什么?
我有字符串形式的 JSON 内容,我首先想用 Jackson 以编程方式遍历它。然后,当我有感兴趣的节点时,我想反序列化它。
我已使用 mapper.readValue 成功反序列化字符串,但现在我想在 jsonNode 而不是字符串上执行此类操作。
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) 我们正在使用最新的 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>\nRun 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());\nRun Code Online (Sandbox Code Playgroud)\n\n因此,我想做的是配置“spring-servlet”和“MappingJackson2HttpMessageConverter”,以便我可以添加要注册的模块。
\n\n是的,我们还没有开始使用@Configuration,我们仍在使用XML,我根本不介意。
\n\n谢谢你的帮助!
\njackson-modules ×10
jackson ×9
java ×8
json ×3
spring ×2
csv ×1
jackson2 ×1
java-11 ×1
java-time ×1
jax-rs ×1
jersey-2.0 ×1
jmh ×1
kotlin ×1
spring-boot ×1
spring-mvc ×1
yaml ×1