仅当一个对象为Java时,将XML转换为Json数组

仅当一个对象为Java时,将XML转换为Json数组,java,arrays,json,xml,Java,Arrays,Json,Xml,我有一个XML,我需要将其转换为JSON,当XML中有多个元素时,它将创建正确的jsonArray,但当单个元素不创建数组时,任何一个都可以帮助我如何在单个元素的情况下获得数组吗 String TEST_XML_STRING = "<Items><Item><Name>Stack</Name><Name>OverFlow</Name></Item></Items>"; JSONObject xmlJS

我有一个XML,我需要将其转换为JSON,当XML中有多个元素时,它将创建正确的jsonArray,但当单个元素不创建数组时,任何一个都可以帮助我如何在单个元素的情况下获得数组吗

String TEST_XML_STRING = "<Items><Item><Name>Stack</Name><Name>OverFlow</Name></Item></Items>";
JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
// output - {"Items":{"Item":{"Name":["Stack","OverFlow"]}}}
String TEST\u XML\u String=“StackOverFlow”;
JSONObject xmlJSONObj=XML.toJSONObject(测试XML字符串);
//输出-{“Items”:{“Item”:{“Name”:[“Stack”,“OverFlow”]}
什么时候

String TEST\u XML\u String=“Stack”;
JSONObject xmlJSONObj=XML.toJSONObject(测试XML字符串);
//输出-{“项”:{“项”:{“名”:“堆栈”}}

但是它应该是
{“Items”:{“Item”:[{“Name”:“Stack”}}}

如果XML标记只有一个子项,它会将该子项转换为对象而不是数组。但是,如果XML标记有两个以上同名的子项,它将返回一个数组


你对此无能为力。唯一的方法是使用另一个库。

似乎没有现成的方法。 如果稍后在代码中处理json,您可以检查它是JSONObject还是JSONArray。如果您需要以正确的格式从spring mvc rest controller返回json对象,您还可以检查处理的内容(JSONArray或JSONObject)。当它是JSONObject时,您必须用具有相同数据的JSONArray替换它


如果您使用的是Java8或更高版本,您应该查看我的开源库:。unXml基本上从XPath映射到Json属性

可以在网上买到

范例


您还可以创建一个解析器,将嵌套的
ObjectNodes
ArrayNodes
返回到所需的任何JSON结构。

我使用这两种方法,但您必须确定要在数组中封装哪些字段。 使用javax.json.*:

private static JsonObject wrapFieldInArray(JsonObject object, String fieldKey) {
    JsonValue fieldValue = object.get(fieldKey);
    if(fieldValue instanceof JsonObject){
        JsonObjectBuilder builder = Json.createObjectBuilder(object);
        builder.remove(fieldKey);
        builder.add(fieldKey, wrapObjectInArray((JsonObject) fieldValue));
        object = builder.build();
    }
    return object;
}

public static JsonArray wrapObjectInArray(JsonObject obj){
    JsonArrayBuilder builder = Json.createArrayBuilder();
    builder.add(obj);
    return builder.build();
}
对于org.json:

private static JSONObject wrapFieldInArray(JSONObject object, String fieldKey) {
    Object fieldValueObj = object.get(fieldKey);
    if(fieldValueObj instanceof JSONObject){
        JSONObject fieldValue = (JSONObject) fieldValueObj;
        object.remove(fieldKey);
        object.put(fieldKey, wrapObjectInArray(fieldValue));
    }
    return object;
}

public static JSONArray wrapObjectInArray(JSONObject obj){
    return new JSONArray().put(new JSONObject(obj.toString()));
}
public static void forceToJSONArray(JSONObject xmlJSONObj, String obj) throws org.json.JSONException 
{
    // where "JSONObject xmlJSONObj" is my JSONObject obtained by passing the XML throug the method toJSONObject 
    // and where "String obj" is the name of the JSONObject I want to force to JSONArray
    Object myObj = xmlJSONObj.opt(obj);
    if (myObj == null)
    {
        // if my obj doesn't exist inside my xmlJSONObj i create it empty
        JSONArray jsonArray = new JSONArray();
        xmlJSONObj.put(obj, jsonArray);
    }
    else if ( myObj instanceof JSONObject ) 
    {
        // if exist but is a JSONObject, I force it to JSONArray
        JSONObject myJSONObj = (JSONObject)myObj;
        JSONArray jsonArray = new JSONArray();
        jsonArray.put(myJSONObj);
        xmlJSONObj.put(obj, jsonArray);
     }
     else if ( myObj instanceof String || myObj instanceof Integer ) 
     {
        // if exist but is a primitive entry (like in your case), I force it to a "primitive" JSONArray
        JSONArray jsonArray = new JSONArray();
        jsonArray.put(myObj);
        xmlJSONObj.put(obj, jsonArray);
     }  
}

我迟到了。。。但是,使用org.json:

private static JSONObject wrapFieldInArray(JSONObject object, String fieldKey) {
    Object fieldValueObj = object.get(fieldKey);
    if(fieldValueObj instanceof JSONObject){
        JSONObject fieldValue = (JSONObject) fieldValueObj;
        object.remove(fieldKey);
        object.put(fieldKey, wrapObjectInArray(fieldValue));
    }
    return object;
}

public static JSONArray wrapObjectInArray(JSONObject obj){
    return new JSONArray().put(new JSONObject(obj.toString()));
}
public static void forceToJSONArray(JSONObject xmlJSONObj, String obj) throws org.json.JSONException 
{
    // where "JSONObject xmlJSONObj" is my JSONObject obtained by passing the XML throug the method toJSONObject 
    // and where "String obj" is the name of the JSONObject I want to force to JSONArray
    Object myObj = xmlJSONObj.opt(obj);
    if (myObj == null)
    {
        // if my obj doesn't exist inside my xmlJSONObj i create it empty
        JSONArray jsonArray = new JSONArray();
        xmlJSONObj.put(obj, jsonArray);
    }
    else if ( myObj instanceof JSONObject ) 
    {
        // if exist but is a JSONObject, I force it to JSONArray
        JSONObject myJSONObj = (JSONObject)myObj;
        JSONArray jsonArray = new JSONArray();
        jsonArray.put(myJSONObj);
        xmlJSONObj.put(obj, jsonArray);
     }
     else if ( myObj instanceof String || myObj instanceof Integer ) 
     {
        // if exist but is a primitive entry (like in your case), I force it to a "primitive" JSONArray
        JSONArray jsonArray = new JSONArray();
        jsonArray.put(myObj);
        xmlJSONObj.put(obj, jsonArray);
     }  
}

希望这能有所帮助;)

现在回复这篇文章已经很晚了,但我的解决方案可能会对某些人有所帮助

问题描述:始终将特定的XML标记转换为JSON数组,而不考虑实例的数量

传统方式:XML标记的单个实例总是会转换为JSON对象,我们在这里什么都做不了。请在下面找到我的解决方案

我的方法:因此,如果我们总是在开始时插入一个伪空标记,只是为了确保同一个XML标记有多个实例,那么就要考虑以上这一点

由于我们在开始时添加了一个虚拟对象,如果我们将此XML转换为JSON,那么在JSON数组的第0个实例中总是有一个空对象。因此,我们必须使用JSONArray类的.remove(0)方法从数组中删除这个空对象

结合所有这些,请查找示例java代码以供参考


导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入org.json.XML;
公共类XMLtoJSONConverter{
公共静态void main(字符串[]args){
字符串xmlData=“StackOverFlow”;
xmlData=xmlData.replaceFirst(“,”);
试一试{
JSONObject xmlJSONObj=XML.toJSONObject(xmlData);
JSONArray JSONArray=xmlJSONObj.getJSONObject(“项目”).getJSONArray(“项目”);
jsonArray.remove(0);
System.out.println(xmlJSONObj);
}捕获(JSONException je){
System.out.println(je.toString());
}
}
}
输出:

{
“项目”:{
“项目”:[{
“名称”:[“堆栈”、“溢出”]
}]
}
}
注意:给定XML中的“Item”标记实际上是一个实例,但在输出中却是JSON数组


快乐编码

基于Mario的解决方案,我做了一些更改,特别是针对Json对象中的嵌套子对象。xmlJSONObj是相同的,但obj参数是一个包含JSON子级路径的列表,并且索引参数仅在递归中是必需的(它应该在第一次执行时从0开始)

我们想要这个JSON:

{
   "person":{
      "name":"Tony",
      "data":{
         "car":"Toyota"
      }
   }
}
{
   "person":{
      "name":"Tony",
      "data":{
         "car":["Toyota"]
      }
   }
}
我们应该这样调用该方法:

forceToJSONArray(xmlJSONObj, Arrays.asList("person", "data", "car"), 0);

你能推荐另一个图书馆吗?重复。答:这里是单一XML元素XML的JSONArray:
{
   "person":{
      "name":"Tony",
      "data":{
         "car":["Toyota"]
      }
   }
}
forceToJSONArray(xmlJSONObj, Arrays.asList("person", "data", "car"), 0);