我正在尝试解析一些看起来像这样的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 {
}

如您所见,我已经从最终的内部类中删除了所有内容,但是仍然无法解析。我试过从输入中删除<correlations asset="Name1" />,但这不是问题的根源。如果我从“关联”中删除private List<Correlation> correlation;,则可以成功解析,但显然没有我需要的信息。

我在这里需要做些什么来使用Jackson解析从XML到Java的2维数组的本质(如果重要的话是2.2.0)是什么?

我得到的错误是:
 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如何映射它们。

最佳答案

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

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;
}
  • 我在任何地方都不需要@JsonIgnoreProperties(ignoreUnknown = true)
  • @JacksonXmlProperty(isAttribute = true)等属性需要
  • asset
  • xml中有2种类型的列表都已解包,因此请使用此numAssets进行指定。
  • 尽管Java中的字段不是文本,但是您可以使用此@JacksonXmlElementWrapper(useWrapping = false)解析最里面的双精度数字。
  • 我介绍了一个包装器类@JacksonXmlText来捕获AssetMatrix
  • 09-30 14:25
    查看更多