2016-07-22 18 views
0

XMLをJsonに変換するライブラリを作成する必要があります。 IしようとSOの答えの1からヘルプを使用してきた、私はこれを行うことができます:XMLの入れ子になったXMLをJSONに変換する

例:

<website> 
<created-at type="datetime"> 2010-02-17T14:36:26-08:00</created-at> 
<id type= 

"integer"> 12</id> 
    <primary-host-id type="integer" nil="true"></primary-host-id> 
    <suspended type="boolean"> false</suspended> 
    <hosts type="array"> 
<host> 
    <id type="integer"> 12</id> 
    <name> example.viviti.com</name> 
</host> 
<host> 
    <id type="integer"> 12</id> 
    <name> example.viviti.com</name> 
    </host> 
</hosts> 
    <ip-address> 127.0.0.1</ip-address> 
    </website> 

だから、私は、

このJSONを生成どのようなコードを書いています
{ip-address= 127.0.0.1, hosts={host=[{name= example.viviti.com, id= 12}, {name= example.viviti.com, id= 12}]}, created-at= 2010-02-17T14:36:26-08:00, id= 12, primary-host-id=, suspended= false} 

"host"を配列として作成していますが、必要なのは配列である "hosts"です。 ので、期待されるJSONのようなもののようになります。これは私の既存のコードである

{ 
    "website":{ 
    "created-at":"2010-02-17T14:36:26-08:00", 
    "id":"12", 
    "suspended":"false", 
    "ip-primary-host-id":"", 
    "ip-address":"127.0.0.1", 
    "hosts":[ 
     { 
      "host":{ 
       "name":"example.viviti.com", 
       "id":"12" 
      } 
     }, 
     { 
      "host":{ 
       "name":"example1.viviti.com", 
       "id":"13" 
      } 
     } 
    ] 
    } 
} 

public static void main(String[] args) throws Exception 
    { 


     XStream magicApi = new XStream(); 
     magicApi.registerConverter(new MapEntryConverter()); 
     magicApi.alias("website", Map.class); 



     Map extractedMap = (Map) magicApi.fromXML(RESPONSE); 
     System.out.println(extractedMap); 

    } 

    public static class MapEntryConverter implements Converter 
    { 

     public boolean canConvert(Class clazz) 
     { 
      return AbstractMap.class.isAssignableFrom(clazz); 
     } 

     public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) 
     { 

      AbstractMap map = (AbstractMap) value; 
      for (Object obj : map.entrySet()) 
      { 
       Map.Entry entry = (Map.Entry) obj; 
       writer.startNode(entry.getKey().toString()); 
       Object val = entry.getValue(); 
       if (null != val) 
       { 
        writer.setValue(val.toString()); 
       } 
       writer.endNode(); 
      } 

     } 

     public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) 
     { 

      Map<String, Object> map = new HashMap<String, Object>(); 

      while (reader.hasMoreChildren()) 
      { 
       reader.moveDown(); 

       String key = reader.getNodeName(); 

       if(reader.hasMoreChildren()) 
       { 
//     reader.moveDown(); 

        Object interim = unmarshal(reader, context); 
        if(!map.containsKey(key)) 
        { 
         map.put(key, interim); 
        } 
        else 
        { 
         List list = new ArrayList(); 
         list.add(map.get(key)); 
         list.add(interim); 
         map.put(key,list); 
        } 
//     reader.moveUp(); 
       } 
       else 
       { 
        String value = reader.getValue(); 
        map.put(key, value); 
       } 

       reader.moveUp(); 
      } 

      return map; 
     } 

    } 

また、私は、JSONでXML名前空間を望んでいません。 ヘルプに感謝します。

答えて

0

なぜJSONObjectを使用しないでください。このオブジェクトを使用してJSONを生成する方がはるかに簡単です。それはあなたにたくさんのLOCを保存します。

public class Main { 

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

出力

{ 
    "website": { 
     "created-at": { 
      "-type": "datetime", 
      "#text": " 2010-02-17T14:36:26-08:00" 
     }, 
     "id": { 
      "-type": "integer", 
      "#text": " 12" 
     }, 
     "primary-host-id": { 
      "-type": "integer", 
      "-nil": "true" 
     }, 
     "suspended": { 
      "-type": "boolean", 
      "#text": " false" 
     }, 
     "hosts": { 
      "-type": "array", 
      "host": [ 
       { 
        "id": { 
         "-type": "integer", 
         "#text": " 12" 
        }, 
        "name": " example.viviti.com" 
       }, 
       { 
        "id": { 
         "-type": "integer", 
         "#text": " 12" 
        }, 
        "name": " example.viviti.com" 
       } 
      ] 
     }, 
     "ip-address": " 127.0.0.1" 
    } 
} 

more info...

+0

私は今取得していますので、これは同様のJSONになります。また、私はそれがしない名前空間を削除したい。 – doctore

+0

ご質問でお答えしたJSONの両方が無効です。あなたは[ここ](http://codebeautify.org/jsonviewer)を解析し、自分の結果を見ることができます。 –

+0

JSONが間違っている可能性があります(2つのparanthesisが余分または不足している可能性があります)が、それは私の懸念事項ではありません。私は内部の要素について話しています。私も正しいjsonを投稿します。 – doctore

関連する問題