gpt4 book ai didi

java - 获取 JSON 中的重复响应

转载 作者:行者123 更新时间:2023-11-30 05:39:32 26 4
gpt4 key购买 nike

我正在尝试创建一个读取 XML 文件并以 Json 格式提供响应的服务,但我在 JSON 响应中收到重复的内容。

请让我知道我做错了什么。

我有复杂类型的 XML,所以我创建了 3 个 POJO 类。

例如,目前我收到重复的 json 响应

对于巧克力,有 2 个类别“每日牛奶”和“其他”,因此我在“巧克力 2”“每日牛奶”和“2 个其他”下收到 4 个回复

XML:

<?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>

Pojo 类

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-------

XMLParser 类

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"
} ]
} ]
}

最佳答案

我认为 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"
} ]
} ]
}

我希望这会有所帮助。

关于java - 获取 JSON 中的重复响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55947172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com