【问题标题】:Getting duplicate response in JSON在 JSON 中获取重复响应
【发布时间】:2019-05-02 06:59:42
【问题描述】:

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

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

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

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

对于巧克力有 2 个类别每日牛奶和其他,所以我在巧克力下得到 4 个回复,每日牛奶 2 个,其他人 2 个

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

【问题讨论】:

    标签: java json object jackson


    【解决方案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"
        } ]
      } ]
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 嗨,tommybee,你给的代码运行良好,但我仍然无法区分我的代码和你的代码之间的区别,对我来说两者看起来都一样,可能是我的矿工变化很大无法识别。您能否指出我所做的错误。
    • 我得到了这个问题,有一些拼写错误,我太愚蠢了。谢谢你的帮助:)
    • 对你好~~!!祝你有美好的一天。
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2018-08-27
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多