【问题标题】:Missing name, in state: START_OBJECT parsing XML using Jackson缺少名称,处于状态:START_OBJECT 使用 Jackson 解析 XML
【发布时间】:2018-06-22 03:14:40
【问题描述】:

我正在尝试解析一些如下所示的 XML:

<correlationMatrix>
    <assetMatrix numAssets="45">
        <correlations asset="Name1" />
        <correlations asset="Name2">
            <correlation asset="Name3">1.23</correlation>
        </correlations>
        <correlations asset="Name4">
            <correlation asset="Name5">2.34</correlation>
            <correlation asset="Name6">3.45</correlation>
        </correlations>
    </assetMatrix>
</correlationMatrix>

我创建了 3 个类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class CorrelationMatrix {
  private List<Correlations> assetMatrix;

  public List<Correlations> getAssetMatrix() {
    return assetMatrix;
  }

  public void setAssetMatrix(List<Correlations> assetMatrix) {
    this.assetMatrix = assetMatrix;
  }
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Correlations {
 private String asset;
 private List<Correlation> correlation;

 public String getAsset() {
   return asset;
 }

  public void setAsset(String asset) {
    this.asset = asset;
  }

  public List<Correlation> getCorrelation() {
    return correlation;
  }

  public void setCorrelations(List<Correlation> correlation) {
    this.correlation = correlation;
  }

}

最后

@JsonIgnoreProperties(ignoreUnknown = true)
public class Correlation {
}

如您所见,我已经从最终的内部类中删除了所有内容,但它仍然无法解析。我尝试从输入中删除&lt;correlations asset="Name1" /&gt;,但这不是问题的根源。如果我从 Correlations 中删除 private List&lt;Correlation&gt; correlation;,那么它会成功解析,但显然没有我需要的信息。

我需要在这里做些什么不同的事情来使用 Jackson(2.2.0 如果重要的话)将本质上是一个二维数组从 XML 解析为 Java?

我得到的错误是:

 Missing name, in state: START_OBJECT (through reference chain: CorrelationMatrix["assetMatrix"]->Correlations["correlation"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(

更新:

问题似乎与correlation 中的值有关。如果我从示例数据中删除 1.23、2.34 和 3.45,那么它会解析 - 所以我需要以某种方式告诉 Jackson 如何映射它们。

【问题讨论】:

    标签: java xml jackson


    【解决方案1】:

    我能够使用这些修改的类解析示例 xml 中的所有元素(添加 getter、setter 并在 Correlations 中使用正确的名称 setCorrelation):

    class CorrelationMatrix {
        private AssetMatrix assetMatrix;
    }
    
    class AssetMatrix {
        @JacksonXmlProperty(isAttribute = true)
        private int numAssets;
    
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<Correlations> correlations;
    }
    
    class Correlations {
        @JacksonXmlProperty(isAttribute = true)
        private String asset;
    
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<Correlation> correlation;
    }
    
    class Correlation {
        @JacksonXmlProperty(isAttribute = true)
        private String asset;
    
        @JacksonXmlText
        private double correlation;
    }
    
    1. 我在任何地方都不需要@JsonIgnoreProperties(ignoreUnknown = true)
    2. @JacksonXmlProperty(isAttribute = true) 需要 assetnumAssets 等属性
    3. xml 中有 2 种类型的列表都未包装,因此请使用 @JacksonXmlElementWrapper(useWrapping = false) 指定它
    4. 尽管 Java 中的字段不是文本,但您可以使用此 @JacksonXmlText 解析最里面的双精度数。
    5. 我引入了一个包装类AssetMatrix 来捕获numAssets

    【讨论】:

    • 非常感谢 Manos,我明天回去工作时试试。 (我为这个示例减少了 XML 以尝试专注于根本问题 - 真正的 XML 具有我不关心的其他属性,因此忽略)
    • 效果很好,再次感谢。我认为缺少的关键组件是 @JacksonXmlText 注释。
    猜你喜欢
    • 2018-07-04
    • 2016-07-08
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多