2016-03-30 17 views
2

デシリアライズ時にJacksonのXMLMapperにルートxml要素の名前を読み取らせるにはどうすればよいですか?Jackson XMLMapperにルート要素名を読み取らせます

入力XMLを汎用JavaクラスのLinkedHashMapに、次にJSONに逆シリアル化しています。デシリアライズ時に入力XMLのルート要素をLinkedHashMapに動的に読み込みたい

コード

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> 
    <NEDOCO>18738</NEDOCO> 
    <NWUNIT>0004</NWUNIT> 
    <FLAG>SUCCESS</FLAG> 
    <MESSAGE>Test Upload</MESSAGE> 
    <Lease> 
    <LeaseVersion>1</LeaseVersion> 
    <F1501B> 
     <NEDOCO>18738</NEDOCO> 
     <NWUNIT>0004</NWUNIT> 
     <NTRUSTRECORDKEY>12</NTRUSTRECORDKEY> 
    </F1501B> 
    </Lease> 
</File> 

実際の出力

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

予想される出力(注意:JSONに存在する「ファイル」という名前のルート要素があります)

{"File":{"NumLeases":"1","NEDOCO":"18738","NWUNIT":"0004","FLAG":"SUCCESS","MESSAGE":"Test Upload","Lease":{"LeaseVersion":"1","F1501B":{"NEDOCO":"18738","NWUNIT":"0004","NTRUSTRECORDKEY":"12"}}}} 

いくつかのスイッチがそれを設定するためにどこかにおそらくあります。いかなる援助も感謝しなければならない。

答えて

1

悲しいことに、そのためのフラグはありません。これは、com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializerのカスタム実装で行うことができます。 (Jackson How-To: Custom Deserializers):

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.databind.*; 
import com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer; 
import com.fasterxml.jackson.databind.module.SimpleModule; 
import com.fasterxml.jackson.dataformat.xml.XmlMapper; 
import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser; 
import java.io.File; 
import java.io.IOException; 
//... 
XmlMapper xmlMapper = new XmlMapper(); 
xmlMapper.registerModule(new SimpleModule().addDeserializer(JsonNode.class, 

    new JsonNodeDeserializer() { 

     @Override 
     public JsonNode deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { 
      String rootName = ((FromXmlParser)p).getStaxReader().getLocalName(); 
      return ctxt.getNodeFactory() 
        .objectNode().set(rootName, super.deserialize(p, ctxt)); 
     } 
    })); 

JsonNode entries = xmlMapper.readTree(new File("source.xml")); 
System.out.println(entries); 
+0

私の元の質問マップにXMLを変換することでしたが、あなたの答えは私が必要なものに洞察力を提供するのに役立つでしたが。このコードは、XMLからJSONへの変換に完全に対応しています。 – Aman

+0

あなたが望むなら、あなたの質問をよりよく反映するように私の答えを編集することができます... –

+0

私はJSONに私のXMLを変換してしまったので、私はそれに応じて私の質問を編集しました。ありがとう! – Aman

関連する問題