【问题标题】:Jackson Json Type Mapping Inner Class [duplicate]Jackson Json类型映射内部类[重复]
【发布时间】:2013-06-21 19:33:44
【问题描述】:

我正在尝试为作为 JSON 传入的对象创建内部类类型,但是虽然我在这里以及杰克逊的网站上阅读了大量内容,但我似乎无法获得正确的组合,所以如果其他人有任何指示,他们将不胜感激。我在下面发布了一些 sn-ps 并删除了所有 getter 和 setter,我不认为他们需要发布。我正在使用杰克逊 2.2。

我试图反序列化的类:

public class Settings {
  private int offset;
  private int limit;
  private String type;
  private Map<String, Criteria> criteria;

  public class Criteria {
    private String restriction;
    private Object value;
  }
}

我用来反序列化的代码:

ObjectMapper om = new ObjectMapper();
TypeFactory tf = om.getTypeFactory();
JavaType map = tf.constructMapLikeType( Map.class, String.class, Criteria.class );
JavaType type = typeFactory.constructType( Settings.class, map );
Settings settings = om.readValue( entity, type );

我的 JSON 测试数据:

{ "type": "org.json.Car", "criteria": { "restriction": "eq", "value": "bmw" } }

【问题讨论】:

标签: java mapping jackson


【解决方案1】:

正确的答案是你缺少内部类的static关键字。

只要确保有“静态”关键字即可。

阅读http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html

这需要你 3 分钟,但会让你在一天的剩余时间里都很开心。

【讨论】:

  • 这应该是公认的答案。
  • redochka - 我们如何决定是使用静态嵌套类(您的回答者)还是简单的组合(juned ahsan 回答。)?
  • @testerjoe2 这是个人选择的问题。当我知道它不会在其他地方使用时,我会使用嵌套静态类,因为它与托管类密切相关。如果我要在其他地方使用这个类,我肯定会把它放在一个单独的类中。
  • 此外,还应从可读性的角度考虑选项。经过几百个 LOC,最好为您的内部类提供一个单独的文件。
  • @testerjoe2 如果你有一堆私有方法,它们都在签名中接受相同的参数集,那么你可以将其重构为一个私有的非静态内部类,将这些参数注入到类,以便方法只接受唯一的参数。这对于在被迭代的项目之间共享公共数据的迭代处理器特别有用。静态内部类更适合于更具有语义意义的公共类,例如 FooProcessor.Parameters 和 FooProcessor.Result
【解决方案2】:

如果可以,那么让你的生活变得简单,将内部类移动到一个普通类,并在 Settings 类中引用。然后使用 jackson 进行编组,这是你如何拥有你的类:

public class Settings {
  private int offset;
  private int limit;
  private String type;
  private Map<String, Criteria> criteria;
  private Criteria criteria;
}


 class Criteria {
    private String restriction;
    private Object value;
  }

【讨论】:

  • 确实是内部类导致了所有问题。
  • 或使用static
  • 并确保内部 static 类的字段为 public
猜你喜欢
  • 2014-08-23
  • 2023-03-30
  • 2021-11-26
  • 2015-05-29
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多