相关疑难解决方法(0)

从Spring MVC作为JSON发送时,动态忽略Java对象中的字段

对于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)

java json hibernate spring-mvc

88
推荐指数
9
解决办法
18万
查看次数

忽略Jackson的序列化特定字段

我正在使用杰克逊图书馆.

我想在序列化/反序列化时忽略特定字段,例如:

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类的实例.我究竟做错了什么?

java serialization json jackson

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

杰克逊序列化:如何忽略超类属性

我想序列化一个不受我控制的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)注释......?我可以将此用于我的目的吗?

但是,从纯粹的设计角度来看,最好的方法是告诉杰克逊我只想序列化最终类的属性,并忽略所有继承的属性.有没有办法做到这一点?

提前致谢.

java inheritance serialization superclass jackson

28
推荐指数
3
解决办法
2万
查看次数

泽西/杰克逊@JsonIgnore在二传手

我有一个带有以下注释的类:

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不起作用.这个问题有什么解决方案吗?

谢谢

java rest json jersey jackson

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

JsonMappingException:不是映射,不是数组,也不是枚举

我正在开发一个 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)

rest json jackson spring-boot jackson-databind

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

如何将Jackson mixin添加到阅读器而不是objectmapper?

我有一个对象,我想在程序的一个部分中使用属性序列化,但没有不同的部分.我还有一个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 json jackson

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

@JSonIgnore的等效代码设置

我是Java和Jackson的新手以及我尝试使用的许多其他技术,所以我会给出一个详细的答案.

有没有办法阻止一个或多个字段使用Jackson序列化为JSon String_like格式,但没有使用任何类型的JSon注释?

像mapper.getSerializationConfig()之类的东西.某事(忽略("displayname"))如果你知道我的意思.我的对象是一个扩展另一个类的类的实例,并且实现了一个接口,所以这些字段来自类的层次结构.我需要该对象的JSon表示,但只包含某些字段,因此我可以通过POST方法在模拟请求中发送该Json.我正在使用Jackson 2.2.2.提前致谢.

java serialization json jackson json-serialization

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

杰克逊映射中的标准和动态属性的混合

我们正在使用提供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,并将其包装在我的业务对象中,但它并不像反序列化处理它那样优雅.

java json jackson

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