仅当一个对象为Java时,将XML转换为Json数组
我有一个XML,我需要将其转换为JSON,当XML中有多个元素时,它将创建正确的jsonArray,但当单个元素不创建数组时,任何一个都可以帮助我如何在单个元素的情况下获得数组吗仅当一个对象为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
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);