2017-05-16 10 views
1

XMLストリングをJsonに変換することを望んでおり、私は以下のようにしています。私は以下のようにXML用のクラスを作成しているXMLからJSONへの変換条件付き

<Item> 
    <Property name="Description" value="Description 1"/> 
    <Property name="EffDate" value="01/05/2017"/> 
    <Property name="ExpDate" value="12/31/9999"/> 
    <Property name="Status" value="Launched"/> 
</Item> 

を変換する必要があり

XML。 g.toJson -

public class Context { 
    @XmlElement(name = "Item") 
    private List<Item> offer; 
} 

public class Item { 
    @XmlElement(name = "Property") 
    private List<Property> properties; 
} 

public class Property { 
    @XmlAttribute 
    private String name; 

    @XmlAttribute 
    private String value; 
} 

私は、JSONに、このJavaオブジェクトに変換するためにGsonライブラリを使用しています。

Comverted JSON -

"offer": [{ 
    "properties": [{ 
       "name": "Description", 
       "value": "Description 1" 
      }, 
      { 
       "name": "EffDate", 
       "value": "01/05/2017" 
      }, 
      { 
       "name": "ExpDate", 
       "value": "12/31/9999" 
      }, 
      { 
       "name": "Status", 
       "value": "Launched" 
      }] 
     }] 

しかし、私たちは以下のようにJSONに変換したい - Itemクラスのプロパティなどのプロパティ名と値を変換する方法はあります

"offer": [{ 
    "Description" : "Description 1", 
    "EffDate":"01/05/2017", 
    "ExpDate": "12/31/9999", 
    "Status": "Launched" 
    }] 

。?

答えて

0

は、このリンクを使用してみてください:https://github.com/stleary/JSON-javaこれは、例えばJSONにXMLを変換することができますJSONヘルパークラスである:

public class Main { 

    public static int PRETTY_PRINT_INDENT_FACTOR = 4; 
    public static String TEST_XML_STRING = 
     "<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to JSON</test>"; 

    public static void main(String[] args) { 
     try { 
      JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING); 
      String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR); 
      System.out.println(jsonPrettyPrintString); 
     } catch (JSONException je) { 
      System.out.println(je.toString()); 
     } 
    } 
} 

・ホープ、このことができます:)

+0

ありますか。?上記のように – Suraj

0

をそれはFasterXMLライブラリを使用して可能です。 XMLとJSONを生成するためのカスタムロジックを記述することができます。 JsonSerializerクラスのserializeを上書きすることによって。変換のために

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.SerializerProvider; 
import java.io.IOException; 

public class ContextSerializer extends JsonSerializer<Context> { 
    @Override 
    public void serialize(Context t, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException { 
     jg.writeStartObject(); 
     jg.writeArrayFieldStart("offer"); 
     for (Item i : t.offer) { 
      jg.writeStartObject(); 
      for (Property property : i.properties) { 
       jg.writeStringField(property.name, property.value); 
      } 
      jg.writeEndObject(); 
     } 
     jg.writeEndArray(); 
     jg.writeEndObject(); 
    } 
} 

は次のようにシリアライザを記述する必要が

import com.fasterxml.jackson.annotation.JsonInclude.Include; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.module.SimpleModule; 
import java.util.ArrayList; 
import java.util.List; 
import javax.xml.bind.JAXBException; 

public class Main { 
    public static void main(String[] args) throws JAXBException, JsonProcessingException { 
     Context c = new Context(); 
     List<Item> offer = new ArrayList<>(); 
     Item pr = new Item(); 
     pr.properties = new ArrayList<>(); 

     Property p = new Property(); 
     p.name = "asdf"; 
     p.value = "va1"; 
     pr.properties.add(p); 

     p = new Property(); 
     p.name = "asdf1"; 
     p.value = "va11"; 
     pr.properties.add(p); 

     offer.add(pr); 
     c.offer = offer; 
     try { 
      SimpleModule module = new SimpleModule(); 
      module.addSerializer(Context.class, new ContextSerializer()); 
      ObjectMapper objectMapper = new ObjectMapper(); 
      objectMapper.registerModule(module); 
      objectMapper.setSerializationInclusion(Include.NON_DEFAULT); 
      String json = objectMapper.writeValueAsString(c); 
      System.out.println(json); 
     } catch (Exception e) { 
      System.out.println(""+e); 
     } 
    } 
} 

O/P JSON:(提供O/P JSONがあれば、あなたの質問に間違っていますあなたはリスト( "オファー")に名前をつけ、それから常にオブジェクトの中にlink

{ 
    "offer": [{ 
      "asdf": "va1", 
      "asdf1": "va11" 
     } 
    ] 
} 

Mavenの依存関係パッケージです:あなたはのJava 8以降を使用している場合

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.9.0.pr3</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.9.0.pr3</version> 
</dependency> 
0

、あなたは私のオープンソースのライブラリをチェックアウトする必要があります:unXml。 unXmlは基本的にXpathsからJson-attributesにマップします。

Maven Centralで利用できます。

import com.fasterxml.jackson.databind.node.ObjectNode; 
import com.nerdforge.unxml.factory.ParsingFactory; 
import com.nerdforge.unxml.parsers.Parser; 
import org.w3c.dom.Document; 

public class Parser { 
    public ObjectNode parseXml(String xml){ 
    Parsing parsing = ParsingFactory.getInstance().create(); 
    Document document = parsing.xml().document(xml); 

    Parser<ObjectNode> parser = parsing.obj("/") 
     .attribute("offer", parsing.arr("/Item") 
      .attribute("Description", "Property[@name='Description']/@value") 
      .attribute("EffDate", "Property[@name='EffDate']/@value") 
      .attribute("ExpDate", "Property[@name='ExpDate']/@value") 
      .attribute("Status", "Property[@name='Status']/@value") 
     ) 
     .build(); 

    ObjectNode result = parser.apply(document); 
    return result; 
    } 
} 

それは次のようなJSONで、JacksonObjectNodeを返します:Itemクラスのプロパティなどのプロパティ名と値を変換する方法が

{ 
    "offer": [ 
    { 
     "Status": "Launched", 
     "Description": "Description 1", 
     "ExpDate": "12/31/9999", 
     "EffDate": "01/05/2017" 
    } 
    ] 
}