【问题标题】:@jsondeserialize does not work when json value is null当 json 值为 null 时,@jsondeserialize 不起作用
【发布时间】:2018-03-13 02:16:36
【问题描述】:

@JsonDeserialize 在这种情况下不适用于 null json 值。它正在抛出错误

// 我有以下 json 字符串。

            {
                "myCount": null
            }

//类

                public class Test {
                  // @JsonDeserialize does not work for null json value in this case. it is throwing error.
                 @JsonDeserialize (using = Custom.class)
                 private double myCount;
            }

//自定义反序列化器

             public class Custom extends JsonDeserializer<Double> {
                //implements deserialize method
                @Override
                public Double deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
                String text = jp.getText();
                if (text == null || text.isEmpty()) {
                 return null;
                } else {
                return Double.valueOf(text);
                }
                    }
                }
            }

请告诉我。 谢谢

【问题讨论】:

    标签: json jackson deserialization json-deserialization


    【解决方案1】:

    如果您的问题是您使用的是原始 double,那么 Arashsoft 可以为您解答。但是我怀疑你会遇到其他问题。

    在我看来,您的反序列化器并没有比默认反序列化器做更多的事情,所以您的反序列化器,如所写,是不必要的。

    您正在调用 jp.getText(),它只会在您的 JSON 值在引号中时返回 String,例如 `"myCount" : "123.45",但这不是您想要的。

    如果您想截取通常分配给您的myCount 字段的空值,您必须在反序列化器中覆盖getNullValue()。实现将取决于您使用的 JSON 库,但对我来说,这是可行的:

    package ca.mydomain.myapp.util;
    
    import java.io.IOException;
    
    import org.codehaus.jackson.JsonParser;
    import org.codehaus.jackson.JsonProcessingException;
    import org.codehaus.jackson.map.DeserializationContext;
    import org.codehaus.jackson.map.deser.std.StdDeserializer;
    
    public class JsonDefaultZeroDoubleDeserializer extends StdDeserializer<Double>
    {
    
        protected JsonDefaultZeroDoubleDeserializer () { this (null); }
    
        protected JsonDefaultZeroDoubleDeserializer (Class<?> vc)
        {
            super (vc);
        }
    
        @Override
        public Double deserialize (JsonParser sp, DeserializationContext dCtxt) throws IOException, JsonProcessingException
        {
            return sp.getCodec().readTree (sp).asDouble ();
        }
    
        @Override
        public Double getNullValue ()
        {
            return 0.00;
        }
    }
    

    【讨论】:

      【解决方案2】:

      问题是您的字段是原始双精度而不是双精度。因此,它不能接受null。

      private double myCount; 更改为private Double myCount;,它应该可以正常工作。

      有关它们的区别的更多信息,请参阅this link

      【讨论】:

      • 正确的是,该字段必须是 Double 而不是 double。但是,如果 JSON 中的值为 null,我认为根本不会调用反序列化器。
      • @PMorganCA,这取决于您的设置:stackoverflow.com/questions/20578846/…
      猜你喜欢
      • 1970-01-01
      • 2018-12-10
      • 2019-11-13
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2019-10-31
      相关资源
      最近更新 更多