Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让Jackson在任何地方都使用自定义反序列化器(对于不是我的类型)_Java_Json_Deserialization_Jackson - Fatal编程技术网

Java 让Jackson在任何地方都使用自定义反序列化器(对于不是我的类型)

Java 让Jackson在任何地方都使用自定义反序列化器(对于不是我的类型),java,json,deserialization,jackson,Java,Json,Deserialization,Jackson,我正在尝试设置Jackson JSON自定义反序列化程序,以将JSON值转换为Long对象。 我遵循了这个站点上的说明:设置自定义反序列化程序 但是,为了让自定义反序列化程序生效,每次我都必须进行注释 e、 g 有没有办法告诉Jackson总是使用自定义反序列化程序来反序列化所有Long属性,而不必每次都使用@jsondeseligate(using=longjsondeseligater.class)注释 LongJsonDeserializer deserializer = new Long

我正在尝试设置Jackson JSON自定义反序列化程序,以将JSON值转换为
Long
对象。 我遵循了这个站点上的说明:设置自定义反序列化程序

但是,为了让自定义反序列化程序生效,每次我都必须进行注释 e、 g

有没有办法告诉Jackson总是使用自定义反序列化程序来反序列化所有
Long
属性,而不必每次都使用
@jsondeseligate(using=longjsondeseligater.class)
注释

LongJsonDeserializer deserializer = new LongJsonDeserializer();

SimpleModule module =
  new SimpleModule("LongDeserializerModule",
      new Version(1, 0, 0, null, null, null));
module.addDeserializer(Long.class, deserializer);

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

这是一个完整的演示应用程序。这适用于最新版本的Jackson,也可能适用于1.7版本的Jackson

import java.io.IOException;

import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.module.SimpleModule;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    TestBean bean = new TestBean();
    bean.value = 42L;

    ObjectMapper mapper = new ObjectMapper();

    String beanJson = mapper.writeValueAsString(bean);
    System.out.println(beanJson);
    // output: {"value":42}

    TestBean beanCopy1 = mapper.readValue(beanJson, TestBean.class);
    System.out.println(beanCopy1.value);
    // output: 42

    SimpleModule module =
      new SimpleModule("LongDeserializerModule",
          new Version(1, 0, 0, null));
    module.addDeserializer(Long.class, new LongJsonDeserializer());

    mapper = new ObjectMapper();
    mapper.registerModule(module);

    TestBean beanCopy2 = mapper.readValue(beanJson, TestBean.class);
    System.out.println(beanCopy2.value);
    // output: 126
  }
}

class TestBean
{
  Long value;
  public Long getValue() {return value;}
  public void setValue(Long value) {this.value = value;}
}

class LongJsonDeserializer extends JsonDeserializer<Long>
{
  @Override
  public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
  {
    Long value = jp.getLongValue();
    return value * 3;
  }
}
import java.io.IOException;
导入org.codehaus.jackson.JsonParser;
导入org.codehaus.jackson.JsonProcessingException;
导入org.codehaus.jackson.Version;
导入org.codehaus.jackson.map.DeserializationContext;
导入org.codehaus.jackson.map.jsonderializer;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.map.module.SimpleModule;
公开课Foo
{
公共静态void main(字符串[]args)引发异常
{
TestBean=新的TestBean();
bean.value=42L;
ObjectMapper mapper=新的ObjectMapper();
字符串beanJson=mapper.writeValueAsString(bean);
系统输出打印(beanJson);
//输出:{“值”:42}
TestBean beanCopy1=mapper.readValue(beanJson,TestBean.class);
System.out.println(beanCopy1.value);
//产出:42
SimpleModule模块=
新的SimpleModule(“LongDeserializerModule”,
新版本(1,0,0,null));
addDeserializer(Long.class,新的LongJsonDeserializer());
映射器=新的ObjectMapper();
映射器注册表模块(模块);
TestBean beanCopy2=mapper.readValue(beanJson,TestBean.class);
System.out.println(beanCopy2.value);
//产出:126
}
}
类TestBean
{
长期价值;
public Long getValue(){return value;}
public void setValue(长值){this.value=value;}
}
类LongJsonDeserializer扩展了JsonDeserializer
{
@凌驾
公共长反序列化(JsonParser jp,反序列化上下文ctxt)抛出IOException,JsonProcessingException
{
Long value=jp.getLongValue();
返回值*3;
}
}

这与中描述的相同,我已经遵循了!我最初发布的内容正确地回答了您提出的问题。我将用一个完整的演示应用程序更新这篇文章。如果类型类似于Map而不是long呢?如何做到这一点?
import java.io.IOException;

import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.module.SimpleModule;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    TestBean bean = new TestBean();
    bean.value = 42L;

    ObjectMapper mapper = new ObjectMapper();

    String beanJson = mapper.writeValueAsString(bean);
    System.out.println(beanJson);
    // output: {"value":42}

    TestBean beanCopy1 = mapper.readValue(beanJson, TestBean.class);
    System.out.println(beanCopy1.value);
    // output: 42

    SimpleModule module =
      new SimpleModule("LongDeserializerModule",
          new Version(1, 0, 0, null));
    module.addDeserializer(Long.class, new LongJsonDeserializer());

    mapper = new ObjectMapper();
    mapper.registerModule(module);

    TestBean beanCopy2 = mapper.readValue(beanJson, TestBean.class);
    System.out.println(beanCopy2.value);
    // output: 126
  }
}

class TestBean
{
  Long value;
  public Long getValue() {return value;}
  public void setValue(Long value) {this.value = value;}
}

class LongJsonDeserializer extends JsonDeserializer<Long>
{
  @Override
  public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
  {
    Long value = jp.getLongValue();
    return value * 3;
  }
}