我是 Jackson 库的新手。我定期将数据写入 json 文件中。我所经历的所有当前教程都会覆盖该文件。
我尝试使用 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) 我有一个类定义说
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 相关的解决方案。
我有以下 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) 我试图创建一个自定义注释来标记给定的属性,当它被注释时总是,所以我有以下结构:
@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) 我想在 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) 我正在做一个项目,想使用 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 正在转义双引号。但是有没有办法避免转义双引号并添加前导和尾随双引号。
任何帮助表示赞赏。顺便说一句,我按照以下链接操作:
我正在尝试验证对我的 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 …
我必须将大量数据编组为 XML 格式。我正在研究 JAXB,因为它是 JDK 8 的一部分,但我不确定它如何处理大量数据。Jackson XML 是我遇到的另一个更新的库。Jackson 在将对象序列化为 XML 方面是否比 JAXB 更快?
我在 Kotlin 中有一个这样的(数据)类。
在使用活动 Spring 配置文件运行应用程序时,live我只想返回name.
但是运行具有活动 Spring 配置文件的应用程序test,我想version显示出来,这样我就可以测试我是否得到了正确的版本。
data class MyClass(
val name: String
@JsonIgnore
val version: Number
)
Run Code Online (Sandbox Code Playgroud)
有可能吗?