大约一年后,我读了一篇文章,解释了如何创建一个基本上是其他注释容器的注释.这样,如果我总是在特定用例中使用相同的5个注释,我会创建一个包含它们的注释并使用它.
不幸的是,我再也找不到这篇文章,而且我现在真的想为我的杰克逊配置做这件事.
由于我自己找不到任何相关信息,我开始质疑我的记忆.这可能还是我错了?
编辑
我想要的是:
@Target(ElementType.METHOD)
@com.fasterxml.jackson.databind.annotation.JsonSerialize(using=MySerializerThatIsUsedEverywhere.class
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(MyCustomXmlAdapter.class)
@SomeOtherEvaluatedByTheSerializer
public @interface SerializerUseCase01 {
public String a();
public int b();
)
Run Code Online (Sandbox Code Playgroud)
我的情况是我有一堆序列化用例,可以由具有不同配置的相同序列化程序处理.为了使一切更容易使用和更透明,我想将jackson配置和序列化器配置包装成一个注释.
我正在使用Jackson与Spring一起进行JSON(de)序列化.但是,在某些情况下,我遇到了两次字段的问题.
我有一个抽象类:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "mimeType")
@JsonSubTypes({
@JsonSubTypes.Type(value = ImageBookmarkJsonModel.class, name = "image/jpeg"),
@JsonSubTypes.Type(value = EpubBookmarkJsonModel.class, name = "application/epub+zip")
})
public abstract class AbstractBookmarkJsonModel extends AbstractJsonModel {
protected String mimeType;
// Removed other fields for brevity
public String getMimeType() {
return mimeType;
}
public void setMimeType(String mimeType) {
this.mimeType = mimeType;
}
@Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(this);
} catch (IOException e) {
throw new IllegalStateException("Cannot convert …Run Code Online (Sandbox Code Playgroud) 我想看看我是否可以用 Java 14 中的新 Record 类替换我现有的 Pojo。但无法这样做。得到以下错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例
com.a.a.Post(无创建者,如默认构造,存在):无法从对象值反序列化(无基于委托或属性的创建者)
我知道错误是说记录没有构造函数,但是从我所看到的记录类在后台处理它,并且相关的 getter 也在后台设置(不完全是 getter,而是 id() title() 等等没有 get 前缀)。是不是因为 Spring 还没有采用最新的 Java 14 记录?请指教。谢谢。
我在 Spring Boot 版本 2.2.6 中执行此操作并使用 Java 14。
以下使用通常的 POJO 工作。
邮政类
public class PostClass {
private int userId;
private int id;
private String title;
private String body;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getId() {
return id;
}
public void setId(int id) { …Run Code Online (Sandbox Code Playgroud) 我有一个第三方域对象,我希望使用Jackson序列化为JSON.通过公共getter可以访问很多属性,但我只对这些属性中的一小部分感兴趣.由于这是第三方对象,我选择了mixin路线.但是,除了在mixin界面上定义的内容之外,我找不到从原始类中排除所有内容的好方法.我试图在mixin类上指定@JsonIgnoreProperties,但它很快就会失控,需要忽略大量属性.任何解决方法?
提前致谢!
编辑:添加一些代码
public class SpecialObject {
private String name;
private Integer id;
public String getName() {
return name;
}
public Integer getId() {
return id;
}
public String getFoo() {
return "foo";
}
}
public interface SpecialObjectMixin {
@JsonProperty
String getName();
}
Run Code Online (Sandbox Code Playgroud)
我希望我只能在序列化的JSON中获得名称.顺便说一下,我正在使用这个来通过cxf-jaxrs与杰克逊作为提供者进行休息.
我有Pojo对象,使用getAsJson函数返回此对象的Json字符串.我使用JsonProperty来定义此对象中的json属性.使用ObjectMapper的writeValueAsString为此对象编写json字符串.
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
@JsonIgnoreProperties(ignoreUnknown=true)
public class LogLikeArticleDetail extends BaseObject {
private static final long serialVersionUID = -2018373118257019033L;
@JsonProperty("LikeArticleGUId")
private String likeArticleGUId;
@JsonProperty("UserId")
private String userID;
@JsonProperty("UserName")
private String userName;
@JsonProperty("IP")
private String ip;
@JsonProperty("OS")
private String os;
@JsonProperty("UserAgent")
private String userAgent;
@JsonProperty("WebsiteCode")
private String websiteCode;
@JsonProperty("ArticleId")
private String articleID;
@JsonProperty("ATitle")
private String aTitle;
@JsonProperty("CateAlias")
private String cateAlias;
@JsonProperty("LikeStatus")
private String likeStatus;
@JsonProperty("TimeStamp")
private Date timeStamp;
//get, set....
//....
@JsonIgnore
public …Run Code Online (Sandbox Code Playgroud) 我需要与之相反@JsonIgnore,我需要告诉杰克逊忽略对象上的所有属性,除了我注释的对象.我不小心想要有人添加一个属性而忘记添加一个@JsonIgnore然后我将它暴露在我不想要的地方.
谁知道如何实现这一目标?
我的 Web 服务使用 Spring MVC 以 xml 和 json 格式返回数据。对于 json,spring 使用 Jackson 和 XStream for XML。但是,XStream 使用字段进行序列化,而 Jackson 使用方法(setter/getter)。
我想在 xml 序列化中包含所有/一些 getter。如何通过自定义转换器或注释来实现这一点?
在Spring 3.3中,我有一个映射到数据库表的实体.在这个实体类中,我有使用@JsonProperty注释的所有属性,例如@JsonProperty("ID").进入控制器,调用服务以通过使用DAO /存储库来获取此类实体.这很好用但是当我使用@ResponseBody将此实体发送回请求者时,所有属性都会被发送两次.一旦要求,但再一次开始小写直到第一个驼峰案件出现.一个例子...
public class MyEntity {
@JsonProperty("MYSpecialSuperId")
private String MYSpecialSuperId;
...
public String getMYSpecialSsuperId() {
return this.MYSpecialSuperId;
}
}
Run Code Online (Sandbox Code Playgroud)
在JSON字符串化后,结果是:
{ "MYSpecialSuperId":""9", "myspecialSuperId":"9" }
Run Code Online (Sandbox Code Playgroud)
为什么结果中的属性是两次,为什么字体不同?
顺便说一句:我的想法是让Java属性以大写字母开头,即使还有一个以上的大写字母.
java ×7
jackson ×6
json ×4
spring ×3
annotations ×1
cxf ×1
duplicates ×1
java-14 ×1
java-record ×1
properties ×1
spring-boot ×1
xml ×1
xstream ×1