【问题标题】:Spring rest Json issue春季休息Json问题
【发布时间】:2015-05-05 06:47:29
【问题描述】:

我在下面找到了已回答的问题

Different names of JSON property during serialization and deserialization

不幸的是,当我们使用 Spring Restful webservice 时,这不起作用。我不确定是什么导致了这个问题,但它给出了一些字段模糊异常。

我要做的是序列化和反序列化具有不同名称的字段名称。

例如

class Test {

    private String name;

    @JsonProperty("myName")
    public String getName() {
        return name;
    }

    @JsonProperty("yourName")
    public void setName(String name) {
        this.name = name;
    }
}

这在 Spring rest 中不起作用

【问题讨论】:

  • 总是提供例外。

标签: spring rest jackson


【解决方案1】:

您不能同时为两者(getter 和 setter)设置 @JsonProperty。您可以为字段或 setter 方法设置。

但是你想要不同的请求和响应名称,像这样创建两个类。

 class StudentResponse{
   @JsonProperty(name="student_name)
   private String name;

   //getter & setter

 }

 class StudentRequest{
   @JsonProperty(name="name)
   private String name;

   //getter & setter

 }

【讨论】:

    【解决方案2】:

    Damith 是对的,您似乎无法在同一个类中标记这两种方法,但是有一种方法可以解决这个问题:

    首先,您必须创建一个自定义反序列化器(或序列化器,取决于您的偏好)。

    我的示例对象:

    @JsonDeserialize(using = ObjectDeserializer.class)
    public class MyObject {
    
    private String name;
    
    public void setName(String name) {
        this.name = name;
    }
    
    @JsonProperty("SomeOtherName")
    public String getName() {
        return name;
    }
    }
    

    注意,我将 getter 标记为具有名字的属性。我给班级一个自定义的反序列化器。看起来像这样:

    public class ObjectDeserializer extends JsonDeserializer<MyObject> {
    
    
            @Override
            public MyObject deserialize(JsonParser jp, DeserializationContext ctxt)
                    throws IOException, JsonProcessingException {
    
                MyObject object = new MyObject();
    
                JsonNode node = jp.getCodec().readTree(jp);
                JsonNode jsonNode = node.get("MyCustomSerializeName");
                object.setName(jsonNode.getTextValue());
    
                return object;
            }
    
        }
    

    该类将创建我的自定义对象并获取设置器字段描述的名称(而不是依赖于属性名称)。

    放在一起,我得到:

    public class DeserializeTest {
    
        public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
            ObjectMapper mapper = new ObjectMapper();
            MyObject o = new MyObject();
            o.setName("Hello");
    
            String writeValueAsString = mapper.writeValueAsString(o);
            System.out.println(writeValueAsString);
    
            String jsonObj = "{\"MyCustomSerializeName\":\"Other Test\"}";
    
            MyObject readValue = mapper.readValue(jsonObj, MyObject.class);
    
            System.out.println(readValue.getName());
    
        }
    }
    

    这个输出:

    {"SomeOtherName":"Hello"}
    Other Test
    

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-13
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2015-03-15
      相关资源
      最近更新 更多