对于hibernate,我有这样的模型类
@Entity
@Table(name = "user", catalog = "userdb")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User implements java.io.Serializable {
private Integer userId;
private String userName;
private String emailId;
private String encryptedPwd;
private String createdBy;
private String updatedBy;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "UserId", unique = true, nullable = false)
public Integer getUserId() {
return this.userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Column(name = "UserName", length = 100)
public String getUserName() {
return this.userName;
}
public void setUserName(String …Run Code Online (Sandbox Code Playgroud) 我正在使用杰克逊图书馆.
我想在序列化/反序列化时忽略特定字段,例如:
public static class Foo {
public String foo = "a";
public String bar = "b";
@JsonIgnore
public String foobar = "c";
}
Run Code Online (Sandbox Code Playgroud)
应该给我:
{
foo: "a",
bar: "b",
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了:
{
foo: "a",
bar: "b",
foobar: "c"
}
Run Code Online (Sandbox Code Playgroud)
我正在用这段代码序列化对象:
ObjectMapper mapper = new ObjectMapper();
String out = mapper.writeValueAsString(new Foo());
Run Code Online (Sandbox Code Playgroud)
我的类中字段的真实类型是Log4J Logger类的实例.我究竟做错了什么?
我想序列化一个不受我控制的POJO类,但是想要避免序列化来自超类的任何属性,而不是来自最终类.例:
public class MyGeneratedRecord extends org.jooq.impl.UpdatableRecordImpl<...>,
example.generated.tables.interfaces.IMyGenerated {
public void setField1(...);
public Integer getField1();
public void setField2(...);
public Integer getField2();
...
}
Run Code Online (Sandbox Code Playgroud)
您可以从示例中猜测此类是由JOOQ生成的,并且继承自复杂的基类UpdatableRecordImpl,该类还具有一些类似于bean属性的方法,这会在序列化期间导致问题.此外,我有几个类似的类,所以最好避免为我生成的所有POJO重复相同的解决方案.
到目前为止,我找到了以下可能的解决方案:
使用mixin技术忽略来自超类的特定字段,如下所示:如何告诉jackson忽略我无法控制源代码的属性?
这个问题是如果基类发生变化(例如,新的getAnything()方法出现在它中),它可能会破坏我的实现.
实现自定义序列化程序并在那里处理问题.这对我来说似乎有点矫枉过正.
顺便说一下,我有一个接口,它描述了我想要序列化的属性,也许我可以混合一个@JsonSerialize(as = IMyGenerated.class)注释......?我可以将此用于我的目的吗?
但是,从纯粹的设计角度来看,最好的方法是告诉杰克逊我只想序列化最终类的属性,并忽略所有继承的属性.有没有办法做到这一点?
提前致谢.
我有一个带有以下注释的类:
class A {
public Map<String,List<String>> references;
@JsonProperty
public Map<String,List<String>> getReferences() {
...
}
@JsonIgnore
public void setReferences(Map<String,List<String>>) {
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试的是忽略反序列化的json.但它不起作用.始终当JSON String到达时,Jackson lib会填充references属性.如果我只使用@JsonIgnore注释,则getter不起作用.这个问题有什么解决方案吗?
谢谢
我正在开发一个 REST API 应用程序,但我的代码有一些问题。我想返回一个扩展 avro 架构并将 HATEOAS 链接添加到响应的对象。我做了一些调查,结果发现我需要对象的自定义序列化器。
有问题的部分代码是:
@JsonValue
public String serialize() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(this);
}
Run Code Online (Sandbox Code Playgroud)
这返回
无法写入 JSON:不是枚举。
当前对象是 avro 模式的扩展。我也尝试过:
@JsonValue
public String serialize() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(getUserData());
}
Run Code Online (Sandbox Code Playgroud)
它返回:
无法写入 JSON:不是数组
其中用户数据是实际的 avro 对象。我不明白这些错误是什么意思。有人可以解释一下吗?另外,是否有更好的方法来结合其他参数返回 avro 对象?
谢谢
编辑:
这是完整的示例:
public class PaginatedUserData extends UserDataAvro {
@JsonValue
public String serialize() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
HashMap<String, String> map = new HashMap<>(); …Run Code Online (Sandbox Code Playgroud) 我有一个对象,我想在程序的一个部分中使用属性序列化,但没有不同的部分.我还有一个ObjectMapper,它被广泛定制,我用于两个序列化.我的第一个倾向是使用Mixin调整属性是否显示,但似乎只能将它们放在ObjectMapper上,而不是放在ObjectMapper返回的阅读器上.基本上我希望能够编写的代码如下所示.
ObjectMapper myMapper = new ObjectMapper(); // in reality there is a lot of customization
Foo foo = myMapper.reader().withMixin(Foo.class, FooMixin.class).readValue(jsonParser, Foo.class);
Run Code Online (Sandbox Code Playgroud) 我是Java和Jackson的新手以及我尝试使用的许多其他技术,所以我会给出一个详细的答案.
有没有办法阻止一个或多个字段使用Jackson序列化为JSon String_like格式,但没有使用任何类型的JSon注释?
像mapper.getSerializationConfig()之类的东西.某事(忽略("displayname"))如果你知道我的意思.我的对象是一个扩展另一个类的类的实例,并且实现了一个接口,所以这些字段来自类的层次结构.我需要该对象的JSon表示,但只包含某些字段,因此我可以通过POST方法在模拟请求中发送该Json.我正在使用Jackson 2.2.2.提前致谢.
我们正在使用提供json的REST服务,该服务将包含一些标准属性以及许多动态属性.
例如:
{
id: 123,
name: "some name",
custom_name: "Some value",
some_other_custom_name: "Some other value",
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望课程设计如下:
public class MyObject{
@JsonProperty int id;
@JsonProperty String name;
private Map<String, String> customVals;
public int getId(){
return id;
}
public String getName(){
return name;
}
public String getCustomVal(String key){
return customVals.get(key);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法说服杰克逊将自定义值推入Map(或实现等效功能)?
现在,我只是将整个对象反序列化为一个Map,并将其包装在我的业务对象中,但它并不像反序列化处理它那样优雅.
jackson ×7
java ×7
json ×7
rest ×2
hibernate ×1
inheritance ×1
jersey ×1
spring-boot ×1
spring-mvc ×1
superclass ×1