当前位置: 首页 > 知识库问答 >
问题:

基于类字段的具有jackson的xml序列化对象的根名称

锺伟志
2023-03-14

首先,让我提前感谢你所有的帮助!

让我解释一下我目前的问题:

我试图用rest/json/swagger层包装一些遗留web服务调用。事实上,这些旧服务使用了一种棘手的专有xml格式,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<service_RegistroEventoSrv>      
  <inputMap type="map">
      <mensajeMT type="map">
          <identificador type="String">
              <_value_>USUPRUEBA</_value_>
          </identificador>
          <modo type="String">
            <_value_>1</_value_>
         </modo>

      </mensajeMT>

    </inputMap>
</service_RegistroEventoSrv>

我能够序列化大多数对象和字段,但根标记有问题。用于序列化的主要类如下所示,但我需要根标记从“serviceId”属性中获取其值

public class CafRequestObject<I,O> {
    private String serviceId;
    private I inputMap;
    private O outputMap;
    private RequestMetaInfo requestMetaInfo;
    private ResponseMetaInfo responseMetaInfo;
 ... getters and setters
}

为了实现这种复杂的自定义序列化,我在jackson XmlMapper for spring rest模板中添加了一些序列化。

 public class CafRequestObjectSerializer  extends CafXsdSerializer<CafRequestObject> {
 public void serialize(CafRequestObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
         final ToXmlGenerator xgen = (ToXmlGenerator) jgen;


         xgen.writeStartObject();
         addRequestMetaInfo(value.getRequestMetaInfo(),xgen);        
         addObject(value.getInputMap(), xgen,INPUT_MAP);         
         xgen.writeEndObject();

}    

   }

有没有办法从字段值中获取根名称?这在我的情况下是强制性的,因为每次调用都必须有不同的根值(所以我没有JsonRootName或XmlRootName)

提前多谢!

共有1个答案

濮俭
2023-03-14

我终于找到了解决办法。也许这不是最好的,但至少对我有用:)

我扩展了jackson的类XmlSerializerProvider并重写了方法

序列化值。

有一部分代码执行以下操作:

QName rootName = _rootNameFromConfig();
        if (rootName == null) {
            rootName = _rootNameLookup.findRootName(cls, _config);
        }

我修改了它的原始行为,以便根据我的根类字段改变它获取根标记的方式:

 QName rootName = _rootNameFromConfig();
        if (rootName == null) {
            if (value instanceof CafRequestObject){
                rootName= getRootNameFromServiceId((CafRequestObject)value);
            }
            else{
                rootName = _rootNameLookup.findRootName(cls, _config);  
            }

        }


protected QName getRootNameFromServiceId(CafRequestObject object){
     return new QName( object.getServiceId()+_SERVICE);
}

谢谢你的帮助!

 类似资料:
  • 我整天都在寻找答案,但到目前为止我还没有太多的运气。 我的问题很简单:如何使用Jackson正确反序列化匿名对象。 它的输出是:JSON=[“com.foo.test.JacksonTest$1”,{“value”:5}],然后我得到一个异常: 线程“main”com.fasterxml.jackson.databind.JSONMappingException中出现异常:无法将类com.foo.

  • 我希望获得以下输出:(我所要做的就是删除字段名,但保留其子字段名。) 以下是我的POJO,由使用: 下面是MAP在搜索过程中使用的我的: null 是否有一种方法可以使它与和一起使用,因为我不能同时使用这两种方法。 有人能帮忙解决这个问题吗?请指导我适当的文档或变通方法,非常感谢。

  • 我和杰克逊有一个问题,我认为这个问题应该很容易解决,但它正在折磨我。 假设我有一个java POJO类,看起来像这样(假设我有getter和setter): 我想反序列化看起来像这样的JSON到一个User对象: Jackson给了我一些问题,因为User不是JSON中的第一级对象。我显然可以创建一个UserWrapper类,它有一个用户对象,然后使用它反序列化,但我知道一定有一个更优雅的解决方案

  • 我只是想序列化和反序列化简单的不可变对象,不明白为什么我不能用Jackson来做 它会因异常而失败: 我知道答案应该很简单,但这是最常见的情况,应该从盒子里起作用,不是吗?

  • 使用Jackson将JSON响应反序列化为DTO。 使用Gson或Jackson反序列化JSON时忽略空字段 他们仍然从那个不规则的JSON对象创建一个对象。 这意味着我需要遍历这个列表,并通过实现一个清理方法删除所有不具有属性“value”的对象。 我的带有Jackson注释的DTO: 给定JSON响应的结果是初始化了3个DTOs,而不是4个。

  • 我有以下xml 我需要将其反序列化为以下POJO: 这里的问题是被包装在元素中