5

次のコードを使用して、ソース XML を JSON に変換しています。ただし、このコードは、ソース XML 内の複数の子レコードを削除し、出力 JSON には最後の子レコードのみが含まれます。

Jackson XML から JSON へのコンバーターを取得して、すべての子レコードを JSON で出力するにはどうすればよいですか?

コード

XmlMapper xmlMapper = new XmlMapper();
Map entries = xmlMapper.readValue(new File("source.xml"), LinkedHashMap.class);
ObjectMapper jsonMapper = new ObjectMapper();
String json = jsonMapper.writer().writeValueAsString(entries);
System.out.println(json);

ソース XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<File>
  <NumLeases>1</NumLeases>
  <FLAG>SUCCESS</FLAG>
  <MESSAGE>Test Upload</MESSAGE>
  <Lease>
     <LeaseVersion>1</LeaseVersion>
     <F1501B>
        <NEDOCO>18738</NEDOCO>
        <NWUNIT>0004</NWUNIT>
        <NTRUSTRECORDKEY>12</NTRUSTRECORDKEY>
     </F1501B>
     <F1501B>
        <NEDOCO>18739</NEDOCO>
        <NWUNIT>0005</NWUNIT>
        <NTRUSTRECORDKEY>8</NTRUSTRECORDKEY>
     </F1501B>
  </Lease>
</File>

実際の出力

{
  "NumLeases": "1",
  "FLAG": "SUCCESS",
  "MESSAGE": "Test Upload",
  "Lease": {
    "LeaseVersion": "1",
    "F1501B": {
      "NEDOCO": "18739",
      "NWUNIT": "0005",
      "NTRUSTRECORDKEY": "8"
    }
  }
}

期待される出力

{
  "NumLeases": "1",
  "FLAG": "SUCCESS",
  "MESSAGE": "Test Upload",
  "Lease": {
    "LeaseVersion": "1",
    "F1501B": [
      {
        "NEDOCO": "18738",
        "NWUNIT": "0004",
        "NTRUSTRECORDKEY": "12"
      },
      {
        "NEDOCO": "18739",
        "NWUNIT": "0005",
        "NTRUSTRECORDKEY": "8"
      }
    ]
  }
}

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

8

org.json API を使用してソース XML をJSONObjectに変換し、Jackson API によって JSONに変換することで、この問題の解決策を得ることができました。

コード

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.json.JSONObject;
import org.json.XML;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

...
...

try (InputStream inputStream = new FileInputStream(new File(
                "source.xml"))) {
    String xml = IOUtils.toString(inputStream);
    JSONObject jObject = XML.toJSONObject(xml);
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    Object json = mapper.readValue(jObject.toString(), Object.class);
    String output = mapper.writeValueAsString(json);
    System.out.println(output);
}

...
...

ソース XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<File>
  <NumLeases>1</NumLeases>
  <FLAG>SUCCESS</FLAG>
  <MESSAGE>Test Upload</MESSAGE>
  <Lease>
     <LeaseVersion>1</LeaseVersion>
     <F1501B>
        <NEDOCO>18738</NEDOCO>
        <NWUNIT>0004</NWUNIT>
        <NTRUSTRECORDKEY>12</NTRUSTRECORDKEY>
     </F1501B>
     <F1501B>
        <NEDOCO>18739</NEDOCO>
        <NWUNIT>0005</NWUNIT>
        <NTRUSTRECORDKEY>8</NTRUSTRECORDKEY>
     </F1501B>
  </Lease>
</File>

出力

{
  "File" : {
    "NumLeases" : "1",
    "FLAG" : "SUCCESS",
    "MESSAGE" : "Test Upload",
    "Lease" : {
      "LeaseVersion" : "1",
      "F1501B" : [ {
        "NEDOCO" : "18738",
        "NWUNIT" : "0004",
        "NTRUSTRECORDKEY" : "12"
      }, {
        "NEDOCO" : "18739",
        "NWUNIT" : "0005",
        "NTRUSTRECORDKEY" : "8"
      } ]
    }
  }
}
于 2016-04-07T19:01:37.530 に答える
0

問題は、XML では「オブジェクト」(JSON 用語では、キーと値のペアのコレクション) と「配列」(名前のない値の順序付けられたシーケンス) の概念が区別されないことです。データ バインディング (POJO) を使用すると、特定の XML 要素がどちらを意味するかを Java 型から判断できますList。それ以外の場合は「オブジェクト」 - ただし、マッパーに XML をマップするように指示するだけの場合java.util.Map、そのような区別はなく、デフォルトの処理では基本的にすべての XML 要素が「オブジェクト」を示すと見なされます。また、「オブジェクト」は重複した名前のプロパティを持つことができないため、値の 1 つ (最後の値) のみが保持されます。

を使用してそれを回避する簡単な方法はありませんXmlMapper。何らかのカスタム処理が必要になります。

于 2016-04-05T00:11:16.010 に答える