我正在尝试创建一个读取XML文件并以Json格式给出响应的服务,但是我在JSON响应中得到了重复。
请让我知道我在做错什么。
我有复杂的XML类型,所以我创建了3个POJO类。
当前我正在获取重复的json响应
对于巧克力,每日牛奶和其他类别有2个类别,因此我在“每日巧克力2”和“其他2个类别”下得到4个响应
<?xml version="1.0"?>
<catalog>
<product productsname="Choclates">
<Parameters total="2">
<Subtype name="dairy milk">
<type>oreo</type>
<type>Silk</type>
<type>nuts</type>
</Subtype>
<Subtype name="Other">
<type>perk</type>
<type>kitkat</type>
<type>5 star</type>
</Subtype>
</Parameters>
</product>
<product productsname="Biscuits">
<Parameters total="3">
<Subtype name="parle">
<type>parle G</type>
<type>krack jack</type>
<type>monaco</type>
</Subtype>
<Subtype name="britannia">
<type>good day</type>
<type>50 50</type>
<type>bourbon</type>
<type>tiger</type>
</Subtype>
<Subtype name="Priya Gold">
<type>Italiano Cookies</type>
<type>Glucose V</type>
<type>Butter Bite</type>
<type>CNC</type>
<type>Marie Lite</type>
<type>Classic Cream</type>
</Subtype>
</Parameters>
</product>
</catalog>
public class product {
private String product_name;
private String parameter;
public List<Subtype> allsubtypes = new ArrayList<Subtype>();
------------getter, setters-------
public class Subtype {
String sybtype;
public List<Type> alltests = new ArrayList<Type>();
------------getter, setters-------
public class Type {
String types;
------------getter, setters-------
public List<product> getDetails() {
List<product> prods = new ArrayList<product>();
org.jdom2.Document jdomDoc;
try {
jdomDoc = useDOMParser(new File("Products.xml"));
List<org.jdom2.Element> products = jdomDoc.getRootElement().getChildren("product");
for (org.jdom2.Element product : products) {
product prod = new product();
prod.setProduct_name(product.getAttributeValue("productsname"));
List<org.jdom2.Element> subtypes = product.getChild("Parameters").getChildren("Subtype");
List<Subtype> listsubtype = new ArrayList<Subtype>();
for (org.jdom2.Element subtype : subtypes) {
Subtype subt = new Subtype();
subt.setSybtype(subtype.getAttributeValue("name"));
List<org.jdom2.Element> types = subtype.getChildren("type");
List<Type> listtype = new ArrayList<Type>();
for (org.jdom2.Element type : types) {
Type typ = new Type();
typ.setTypes(type.getText());
listtype.add(typ);
}
subt.setAlltests(listtype);
listsubtype.add(subt);
}
prod.setAlltests(listsubtype);
prods.add(prod);
}
} catch (Exception e) {
e.printStackTrace();
}
return prods;
}
private static org.jdom2.Document useDOMParser(File fileName)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setIgnoringComments(true);
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fileName);
DOMBuilder domBuilder = new DOMBuilder();
return domBuilder.build(doc);
}
JSON转换器类
public class ObjectToJson {
public static void main(String[] args) {
XMLParser xml = new XMLParser();
ObjectMapper mapper = new ObjectMapper();
List<product> prods = new ArrayList<product>();
prods = xml.getDetails();
for (product p : prods) {
try {
System.out.println("**********************************************");
String jsonInString2 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(p);
System.out.println(jsonInString2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
**********************************************
{
"product_name" : "Choclates",
"parameter" : null,
"allsubtypes" : [ {
"sybtype" : "dairy milk",
"alltests" : [ {
"types" : "oreo"
}, {
"types" : "Silk"
}, {
"types" : "nuts"
} ]
}, {
"sybtype" : "Other",
"alltests" : [ {
"types" : "perk"
}, {
"types" : "kitkat"
}, {
"types" : "5 star"
} ]
} ],
"alltests" : [ {
"sybtype" : "dairy milk",
"alltests" : [ {
"types" : "oreo"
}, {
"types" : "Silk"
}, {
"types" : "nuts"
} ]
}, {
"sybtype" : "Other",
"alltests" : [ {
"types" : "perk"
}, {
"types" : "kitkat"
}, {
"types" : "5 star"
} ]
} ]
}
**********************************************
{
"product_name" : "Biscuits",
"parameter" : null,
"allsubtypes" : [ {
"sybtype" : "parle",
"alltests" : [ {
"types" : "parle G"
}, {
"types" : "krack jack"
}, {
"types" : "monaco"
} ]
}, {
"sybtype" : "britannia",
"alltests" : [ {
"types" : "good day"
}, {
"types" : "50 50"
}, {
"types" : "bourbon"
}, {
"types" : "tiger"
} ]
}, {
"sybtype" : "Priya Gold",
"alltests" : [ {
"types" : "Italiano Cookies"
}, {
"types" : "Glucose V"
}, {
"types" : "Butter Bite"
}, {
"types" : "CNC"
}, {
"types" : "Marie Lite"
}, {
"types" : "Classic Cream"
} ]
} ],
"alltests" : [ {
"sybtype" : "parle",
"alltests" : [ {
"types" : "parle G"
}, {
"types" : "krack jack"
}, {
"types" : "monaco"
} ]
}, {
"sybtype" : "britannia",
"alltests" : [ {
"types" : "good day"
}, {
"types" : "50 50"
}, {
"types" : "bourbon"
}, {
"types" : "tiger"
} ]
}, {
"sybtype" : "Priya Gold",
"alltests" : [ {
"types" : "Italiano Cookies"
}, {
"types" : "Glucose V"
}, {
"types" : "Butter Bite"
}, {
"types" : "CNC"
}, {
"types" : "Marie Lite"
}, {
"types" : "Classic Cream"
} ]
} ]
}
答案 0 :(得分:1)
我认为alltests变量应该是Subtype类的子级。
产品类仅具有一个子类型作为列表类。
好吧,我将所有这些都放在一个名为XMLParser.java的类中。
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.codehaus.jackson.map.ObjectMapper;
import org.jdom2.input.DOMBuilder;
import org.xml.sax.SAXException;
public class XMLParser {
final static class Type {
private String types;
public String getTypes() {
return types;
}
public void setTypes(String types) {
this.types = types;
}
}
final static class Subtype {
private String sybtype;
private List<Type> alltests = new ArrayList<Type>();
public String getSybtype() {
return sybtype;
}
public void setSybtype(String sybtype) {
this.sybtype = sybtype;
}
public List<Type> getAlltests() {
return alltests;
}
public void setAlltests(List<Type> alltests) {
this.alltests = alltests;
}
}
final static class product {
private String product_name;
private String parameter;
private List<Subtype> allsubtypes = new ArrayList<Subtype>();
public void setProduct_name(String product_name) {
this.product_name = product_name;
}
public String getProduct_name() {
return this.product_name;
}
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
public List<Subtype> getAllsubtypes() {
return allsubtypes;
}
public void setAllsubtypes(List<Subtype> allsubtypes) {
this.allsubtypes = allsubtypes;
}
}
public List<product> getDetails() {
List<product> prods = new ArrayList<product>();
org.jdom2.Document jdomDoc;
try {
jdomDoc = useDOMParser(new File("resource/stackoverflow/Products.xml"));
List<org.jdom2.Element> products = jdomDoc.getRootElement().getChildren("product");
for (org.jdom2.Element product : products) {
product prod = new product();
prod.setProduct_name(product.getAttributeValue("productsname"));
List<org.jdom2.Element> subtypes = product.getChild("Parameters").getChildren("Subtype");
List<Subtype> listsubtype = new ArrayList<Subtype>();
for (org.jdom2.Element subtype : subtypes) {
Subtype subt = new Subtype();
subt.setSybtype(subtype.getAttributeValue("name"));
List<org.jdom2.Element> types = subtype.getChildren("type");
List<Type> listtype = new ArrayList<Type>();
for (org.jdom2.Element type : types) {
Type typ = new Type();
typ.setTypes(type.getText());
listtype.add(typ);
}
subt.setAlltests(listtype);
listsubtype.add(subt);
}
//prod.setAlltests(listsubtype);
prod.setAllsubtypes(listsubtype);
prods.add(prod);
}
} catch (Exception e) {
e.printStackTrace();
}
return prods;
}
private org.jdom2.Document useDOMParser(File fileName)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setIgnoringComments(true);
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
org.w3c.dom.Document doc = dBuilder.parse(fileName);
DOMBuilder domBuilder = new DOMBuilder();
return domBuilder.build(doc);
}
public static void main(String[] args) {
XMLParser xml = new XMLParser ();
ObjectMapper mapper = new ObjectMapper();
List<product> prods = new ArrayList<product>();
prods = xml.getDetails();
for (product p : prods) {
try {
System.out.println("**********************************************");
String jsonInString2 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(p);
System.out.println(jsonInString2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
检查setAllsubtypes方法,
//prod.setAlltests(listsubtype);
prod.setAllsubtypes(listsubtype);
输出如下。
**********************************************
{
"product_name" : "Choclates",
"parameter" : null,
"allsubtypes" : [ {
"sybtype" : "dairy milk",
"alltests" : [ {
"types" : "oreo"
}, {
"types" : "Silk"
}, {
"types" : "nuts"
} ]
}, {
"sybtype" : "Other",
"alltests" : [ {
"types" : "perk"
}, {
"types" : "kitkat"
}, {
"types" : "5 star"
} ]
} ]
}
**********************************************
{
"product_name" : "Biscuits",
"parameter" : null,
"allsubtypes" : [ {
"sybtype" : "parle",
"alltests" : [ {
"types" : "parle G"
}, {
"types" : "krack jack"
}, {
"types" : "monaco"
} ]
}, {
"sybtype" : "britannia",
"alltests" : [ {
"types" : "good day"
}, {
"types" : "50 50"
}, {
"types" : "bourbon"
}, {
"types" : "tiger"
} ]
}, {
"sybtype" : "Priya Gold",
"alltests" : [ {
"types" : "Italiano Cookies"
}, {
"types" : "Glucose V"
}, {
"types" : "Butter Bite"
}, {
"types" : "CNC"
}, {
"types" : "Marie Lite"
}, {
"types" : "Classic Cream"
} ]
} ]
}
我希望这会有所帮助。