Получение дубликата ответа в формате JSON - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь создать службу, которая читает файл 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"
    } ]
  } ]
}

1 Ответ

1 голос
/ 02 мая 2019

Я думаю, что переменная 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"
    } ]
  } ]
}

Я надеюсь, что это будетпомощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...