我不明白这个问题。Jackson 将从/到您在原始问题中定义的 Message POJO 的当前版本(反)序列化,没有错误,也没有任何特殊配置(@JsonProperty 注释除外)。当前的 Message POJO 没有名为 success 的字段,但它确实定义了一个名为 success 的属性,这就是 Jackson 乐于将示例 JSON 映射到它而无需任何额外配置的原因。是否要删除 @JsonProperty 注释?
如果是这种情况,那么您可以这样做,并且 Jackson 仍将使用相同的示例 JSON 从/向 Message POJO(反)序列化,而无需任何其他配置,因为 isSuccess 和 setSuccess 方法签名已经充分定义 Message 具有名为 success 的属性,与 JSON 中的元素名称匹配。
以下示例说明了这些要点。
带有消息 POJO 的示例 1 与原始问题中的定义完全一致:
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
// input: {"success":false}
String inputJson = "{\"success\":false}";
ObjectMapper mapper = new ObjectMapper();
Message message = mapper.readValue(inputJson, Message.class);
System.out.println(mapper.writeValueAsString(message));
// output: {"success":false}
}
}
class Message
{
private Map<String, String> dataset = new HashMap<String, String>();
@JsonProperty("success")
public boolean isSuccess()
{
return Boolean.valueOf(dataset.get("success"));
}
@JsonProperty("success")
public void setSuccess(boolean success)
{
dataset.put("success", String.valueOf(success));
}
}
示例 2 修改了 Message POJO 以删除 @JsonProperty 注释。
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
// input: {"success":false}
String inputJson = "{\"success\":false}";
ObjectMapper mapper = new ObjectMapper();
Message message = mapper.readValue(inputJson, Message.class);
System.out.println(mapper.writeValueAsString(message));
// output: {"success":false}
}
}
class Message
{
private Map<String, String> dataset = new HashMap<String, String>();
public boolean isSuccess()
{
return Boolean.valueOf(dataset.get("success"));
}
public void setSuccess(boolean success)
{
dataset.put("success", String.valueOf(success));
}
}
MessageWrapper 示例:
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
// input: {"success":false}
String inputJson = "{\"success\":true}";
ObjectMapper mapper = new ObjectMapper();
MessageWrapper wrappedMessage = mapper.readValue(inputJson, MessageWrapper.class);
System.out.println(mapper.writeValueAsString(wrappedMessage));
// output: {"success":true}
}
}
class MessageWrapper
{
@JsonUnwrapped
@JsonProperty // exposes non-public field for Jackson use
Message message;
}