我做的。再次。StackOverFlow给我的动力比问题大:D
因此,经过每小时3天漫长的思考,我的问题几乎消失了,我几乎拒绝对json进行反序列化,并在这种情况下决定不使用json,但比起考虑类的jsonidentity,这是我的解决方案。
使用JsonIdentityInfo,Jackson每次序列化您的对象时,都会向其添加一个id(在我的情况下是uuid),这样它就不会总是扫描它。
不幸的是,当我在不同的情况下测试我的解决方案时,发现它仅适用于json身份的第一个版本。因此,第一次“扫描”完全像一个咒语一样工作,但是第二次扫描却得到了jsonidentity而不是对象的ID。这使我了解到,我需要自己的序列化逻辑,可以在其中控制递归深度。我写的。我只能显示自定义json serializator的骨架,因为序列化的逻辑很容易并且取决于类结构。
public class JsonUserSerializer extends JsonSerializer<User> {
@Override
public void serialize(User o, JsonGenerator jsonGen, SerializerProvider serializerProvider)
throws IOException, JsonProcessingException {
// ... logic of json generation
Field[] userClassFields = o.getClass().getDeclaredFields();
// ... logic of json generation
}
@Override
public Class<User> handledType() {
return User.class;
}
}
我在处理代码时必须解决的主要问题是字段的命名。因为是json结构,所以它是:“ name”:“ value”-在我的情况下是名称- 它是fieldName。但是硬编码不是我的方法。比我已经找到了获取类的所有字段的解决方案,o.getClass().getDeclaredFields()
而不是按索引查找需求字段的解决方案。我认为这不是最好的解决方案,但是一个小时我都没有找到其他解决方案(如果您知道其他方法,请写评论- 我会为此推荐作者)。
忘记显示如何使用为特定类指定的定制JsonSerialiser:
@Entity
@Table(name = "users")
@JsonSerialize(using = JsonUserSerializer.class)
public class User implements Serializable {
// a lot of fields and getter, and setters
}