标签: jackson

如何使用 jackson 库将 pojos 附加到 json 文件中

我是 Jackson 库的新手。我定期将数据写入 json 文件中。我所经历的所有当前教程都会覆盖该文件。

java json jackson

0
推荐指数
1
解决办法
3921
查看次数

使用 Jackson 在 CSV 文件中设置本地化列标题

我尝试使用 jackson-dataformat-csv 创建 CSV 文件,如本教程中所述(杰克逊注释方法)中所述。

这是我的 Csv 行的定义:

@JsonPropertyOrder(value = {"foo", "bar"})
public class MyDataCsv implements Serializable {
    private String foo;

    private String bar;

    // getter & setter
    //...
}
Run Code Online (Sandbox Code Playgroud)

这就是我使用 Jackson 构建 CSV 的方法:

private void generateCsv(OutputStream o, List<MyDataCsv> data) {
    CsvMapper mapper = new CsvMapper();
    CsvSchema schema = mapper.schemaFor(MyDataCsv.class).withHeader();

    ObjectWriter objectWriter = mapper.writer(schema);
    objectWriter.writeValue(o, data);
}
Run Code Online (Sandbox Code Playgroud)

在我的输出 CSV 中,我得到:

| foo  | bar  |
+------+------+
| foo1 | bar1 |
| foo2 | bar2 |
| …
Run Code Online (Sandbox Code Playgroud)

java csv internationalization jackson

0
推荐指数
1
解决办法
8318
查看次数

更改 JSON 键而不更改 POJO 中的变量名称

我有一个类定义说

class Employee {
 String id;
 String name;
 int age;
 //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我想用它创建一个 json 对象,如下所示

{
  "id" : "A12",
  "employee_name" : "Abhishek"
  age : 97
}
Run Code Online (Sandbox Code Playgroud)

注意employee_name不对应 POJO 变量name。那么我可以添加某些注释来帮助我这样做吗?就像是

@JSONKey(value="employee_name")
String name
Run Code Online (Sandbox Code Playgroud)

给出与 GSON 和/或 Jackson 相关的解决方案。

java json jackson gson

0
推荐指数
1
解决办法
7268
查看次数

Spring boot JPA 错误:无法处理托管/返回引用“defaultReference”:未从类型中找到返回引用属性

我有以下 3 个域模型对象,其中 appuser 的排名和训练状态如下。Get 调用在返回 JSON 对象的地方工作正常,但在 JPA 中添加模型对象时出现错误。

Cannot handle managed/back reference 'defaultReference': no back reference property found from type [simple type, class com.springboot.model.Rank
Run Code Online (Sandbox Code Playgroud)

`

        package com.springboot.model;

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import static javax.persistence.GenerationType.IDENTITY;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;

    import com.fasterxml.jackson.annotation.JsonBackReference;
    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.fasterxml.jackson.annotation.JsonManagedReference;

    @Entity
    @Table(name = "app_user", catalog = "testdb")
    public class AppUser implements java.io.Serializable {

        private Integer id;
        private Rank rank;
        private Trainingstatus trainingstatus;
        private String name;
        private …
Run Code Online (Sandbox Code Playgroud)

jpa jackson spring-data-jpa spring-boot spring-rest

0
推荐指数
1
解决办法
3345
查看次数

@JsonSerialize 和 @JsonDeserialize 包含在注释中时不起作用

我试图创建一个自定义注释来标记给定的属性,当它被注释时总是,所以我有以下结构:

@JsonComponent
public class TokenSerializer {

    @JsonSerialize(using = IdToTokenSerializer.class) // This does not work 
    @JsonDeserialize(using = TokenToIdDeserializer.class) // This does not work 
    @Retention(RetentionPolicy.RUNTIME)
    public static @interface TokenizedId {
        Class<?> value();
    }

    public static class IdToTokenSerializer extends JsonSerializer<Long> implements ContextualSerializer {
        ...
    }

    public static class TokenToIdDeserializer extends JsonDeserializer<Long> implements ContextualDeserializer {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我这样用?因为@TokenizedId将提供一个类,该类将有条件地考虑在序列化器/反序列化器上做某事。该值是使用 配置的ContextualDeserializer,从 中获取类@TokenizedId

问题是,当我这样注释时,序列化器和反序列化器都不起作用:

@TokenizedId(MyClass.class)
private Long id;
Run Code Online (Sandbox Code Playgroud)

但是,他们在工作的时候使用这样(去除@JsonSerialize@JsonDeserialize@TokenizedId):

@JsonSerialize(using = IdToTokenSerializer.class)
@JsonDeserialize(using …
Run Code Online (Sandbox Code Playgroud)

java serialization jackson spring-boot

0
推荐指数
1
解决办法
2176
查看次数

使用 JSON 使用 Spring Boot 格式化 Java 时间

我想在 Spring Boot v1.5.14.RELEASE 应用程序中实现一个自定义验证器。首先,我创建一个自定义约束注释:

我有这个对象:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@SuperBuilder
public class Hotel {

    @JsonFormat(pattern = "yyyy-MM-dd")
    private OffsetDateTime interactionDurationStart;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private OffsetDateTime interactionDurationEnd;

}
Run Code Online (Sandbox Code Playgroud)

在yml中:

spring:
  jackson:
    mapper:
      DEFAULT_VIEW_INCLUSION: true
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false
Run Code Online (Sandbox Code Playgroud)

在我的配置文件中:

@Primary
@Bean
public ObjectMapper objectMapper() {

    ObjectMapper objectMapper = new ObjectMapper();
    //objectMapper.registerModule(new JavaTimeModule());
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(OffsetDateTime.class, new JsonSerializer<OffsetDateTime>() {
        @Override
        public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
            jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(offsetDateTime));
        }
    });
    objectMapper.registerModule(simpleModule);

    return objectMapper; …
Run Code Online (Sandbox Code Playgroud)

java spring json jackson spring-boot

0
推荐指数
1
解决办法
1144
查看次数

如何避免Jackson在Java中转义双引号?

我正在做一个项目,想使用 ObjectMapper 将一些用 Gson 编写的代码重写为 Jackson。所以我试图使用一些属性创建一个 JSON 字符串,如下所示:

ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objNode= objectMapper.createObjectNode();
objNode.put("identifierVal", UUID.randomUUID().toString());
objNode.put("version", "two");
List<String> namesList= new ArrayList<>();
namesList.add("test");
objNode.put("namesList", namesList.toString());
String requestObject = objectMapper.writeValueAsString(objNode.toString());
Run Code Online (Sandbox Code Playgroud)

预期结果:

{
   "identifierVal":1234,
   "version":"two",
   "namesList":[
      "test"
   ]
}
Run Code Online (Sandbox Code Playgroud)

实际的:

"{  
        "\identifierVal\": 1234,   
        "\version\":"\two\",
"\namesList\": ["\test\"]

    }"
Run Code Online (Sandbox Code Playgroud)

因此,一旦我使用 Jackson 创建了一个 JSON 字符串,事实证明它会转义字段名称和值的双引号,并\在前导和尾随空格处添加一个。所以服务调用由于逃逸而失败。

我已经阅读了一些文档,我可以理解 Jackson 正在转义双引号。但是有没有办法避免转义双引号并添加前导和尾随双引号。

任何帮助表示赞赏。顺便说一句,我按照以下链接操作:

为什么 ObjectNode 在 Json 字符串中添加反斜杠

Jackson 在 json 中添加反斜杠

java json jackson gson

0
推荐指数
1
解决办法
628
查看次数

杰克逊反序列化 - 错误的身体类型成功反序列化

我正在尝试验证对我的 REST 控制器的 POST 请求,在我的 DTO 类上有一些属性和验证:

EmployeeDTOInput.java

@Getter
@Setter
public class EmployeeDTOInput {

  @NotBlank("name must not be blank!")
  private String name;

  @DecimalMin(value = "0.01", message = "salary must be greather than or equal to $0.01!")
  private BigDecimal salary;

  @NotNull("commission elegible must not be null!")
  private boolean commissionElegible;
}
Run Code Online (Sandbox Code Playgroud)

另外,在控制器上有一个有效的检查器:

@PostMapping
public EmployeeDTO store(@RequestBody @Valid EmployeeDTOInput employeeDTOInput) {
 // Controller logic
}
Run Code Online (Sandbox Code Playgroud)

写一些测试,我发现,如果我的 JSON 请求对象有这个语法,它工作正常:

{
  name: 12345,
  salary: "30000.50"
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以拒绝这种请求,我的意思是,根据实际的 DTO 属性仅接受 JSON 属性类型的 100% 一致性,仅接受浮点格式 to salary …

java spring json jackson

0
推荐指数
1
解决办法
258
查看次数

Jackson 在创建 XML 方面的性能与 JAXB 相比如何?

我必须将大量数据编组为 XML 格式。我正在研究 JAXB,因为它是 JDK 8 的一部分,但我不确定它如何处理大量数据。Jackson XML 是我遇到的另一个更新的库。Jackson 在将对象序列化为 XML 方面是否比 JAXB 更快?

java jaxb jackson jackson-dataformat-xml

0
推荐指数
1
解决办法
321
查看次数

仅将 @JsonIgnore 用于生产,但在测试中它应该在那里

我在 Kotlin 中有一个这样的(数据)类。
在使用活动 Spring 配置文件运行应用程序时,live我只想返回name.
但是运行具有活动 Spring 配置文件的应用程序test,我想version显示出来,这样我就可以测试我是否得到了正确的版本。

data class MyClass( 

 val name: String

 @JsonIgnore
 val version: Number

)
Run Code Online (Sandbox Code Playgroud)

有可能吗?

java json jackson kotlin fasterxml

0
推荐指数
1
解决办法
54
查看次数