2011-07-19 25 views
9

私はWebサービスを.netで持っています。データベースからデータを取得すると、Android MobileでJSONファイルが返されます。 JSONファイルをXMLまたはテキストに変換するにはどうすればよいですか。JsonをXmlに変換する最も簡単な方法

+0

あなたのUI上のJavaScriptでJSONを読んで、それを解析する必要がありかもしれません。 (それに応じて表示されます)。 [ここ](http://www.webmasterworld.com/javascript/3540648.htm)を参照する必要がある場合 – Nishant

+0

JSON **は**テキストです。 –

+0

[this](http://stackoverflow.com/questions/559296/java-implementation-of-json-to-xml-conversion)と[this](http://www.discursive.com/books/)を参照してください。 cjcook/reference/json-sect-convert-json-xml)これがあなたを助けてくれることを願っています。 – Sandy

答えて

1

JSONをXMLに変換するためのアンドロイドの直接変換APIはありません。まずJSONを解析する必要があります。次に、JSONをxmlに変換するロジックを記述する必要があります。

7

シンプルな解決策として、簡単なコード行を使用して任意の複雑なJSONをXMLに変換できるので、Jacksonをお勧めします。

import org.codehaus.jackson.map.ObjectMapper; 

import com.fasterxml.jackson.xml.XmlMapper; 

public class Foo 
{ 
    public String name; 
    public Bar bar; 

    public static void main(String[] args) throws Exception 
    { 
    // JSON input: {"name":"FOO","bar":{"id":42}} 
    String jsonInput = "{\"name\":\"FOO\",\"bar\":{\"id\":42}}"; 

    ObjectMapper jsonMapper = new ObjectMapper(); 
    Foo foo = jsonMapper.readValue(jsonInput, Foo.class); 

    XmlMapper xmlMapper = new XmlMapper(); 
    System.out.println(xmlMapper.writeValueAsString(foo)); 
    // <Foo xmlns=""><name>FOO</name><bar><id>42</id></bar></Foo> 
    } 
} 

class Bar 
{ 
    public int id; 
} 

このデモはJackson 1.7.7を使用しています(新しい1.7.8でも動作するはずです)、Jackson XML Databind 0.5.3(ジャクソン1.8とまだ互換性がありません)、およびStax2 3.1.1

+0

'Foo'やクラスが必要ない/しない場合はどうすればいいですか?一般的な方法はありますか? –

1

標準org.json.XML JSONとXMLを両方向で変換します。

変換は、XML属性をまったく作成しない(エンティティのみ)ため、XML出力は可能な場合よりも大きくなります。しかし、変換が必要なデータ構造に一致するJavaクラスを定義する必要はありません。

+0

無効なXMLが生成されます。 –

2

ここでは、有効なXMLを生成してこれを行う方法の例を示します。また、MavenプロジェクトでJacksonライブラリを使用しています。

Mavenのセットアップ:

<!-- https://mvnrepository.com/artifact/com.fasterxml/jackson-xml-databind --> 
    <dependency> 
     <groupId>com.fasterxml</groupId> 
     <artifactId>jackson-xml-databind</artifactId> 
     <version>0.6.2</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.6</version> 
    </dependency> 

ここでは、最初のオブジェクトにJSON文字列を変換し、XMLにXMLMapperを持つオブジェクトに変換しても、間違った要素名を削除するいくつかのJavaコードです。 XML要素名に間違った文字を置き換える理由は、$ oidのようなJSON要素名にXMLで許可されていない文字を使用できるという事実です。 Jacksonのライブラリはそれを考慮していないので、要素名と名前空間宣言から不正な文字を削除するコードを追加してしまいました。ここで

import com.fasterxml.jackson.core.type.TypeReference; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.xml.XmlMapper; 

import java.io.IOException; 
import java.util.Map; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* Converts JSON to XML and makes sure the resulting XML 
* does not have invalid element names. 
*/ 
public class JsonToXMLConverter { 

    private static final Pattern XML_TAG = 
      Pattern.compile("(?m)(?s)(?i)(?<first><(/)?)(?<nonXml>.+?)(?<last>(/)?>)"); 

    private static final Pattern REMOVE_ILLEGAL_CHARS = 
      Pattern.compile("(i?)([^\\s=\"'a-zA-Z0-9._-])|(xmlns=\"[^\"]*\")"); 

    private ObjectMapper mapper = new ObjectMapper(); 

    private XmlMapper xmlMapper = new XmlMapper(); 

    String convertToXml(Object obj) throws IOException { 
     final String s = xmlMapper.writeValueAsString(obj); 
     return removeIllegalXmlChars(s); 
    } 

    private String removeIllegalXmlChars(String s) { 
     final Matcher matcher = XML_TAG.matcher(s); 
     StringBuffer sb = new StringBuffer(); 
     while(matcher.find()) { 
      String elementName = REMOVE_ILLEGAL_CHARS.matcher(matcher.group("nonXml")) 
        .replaceAll("").trim(); 
      matcher.appendReplacement(sb, "${first}" + elementName + "${last}"); 
     } 
     matcher.appendTail(sb); 
     return sb.toString(); 
    } 

    Map<String, Object> convertJson(String json) throws IOException { 
     return mapper.readValue(json, new TypeReference<Map<String, Object>>(){}); 
    } 

    public String convertJsonToXml(String json) throws IOException { 
     return convertToXml(convertJson(json)); 
    } 
} 

convertJsonToXmlのJUnitテストです:

@Test 
void convertJsonToXml() throws IOException, ParserConfigurationException, SAXException { 
    try(InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("json/customer_sample.json")) { 
     String json = new Scanner(in).useDelimiter("\\Z").next(); 
     String xml = converter.convertJsonToXml(json); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(new ByteArrayInputStream(xml.getBytes("UTF-8"))); 
     Node first = doc.getFirstChild(); 
     assertNotNull(first); 
     assertTrue(first.getChildNodes().getLength() > 0); 
    } 
} 
関連する問題