Problema de estrutura de arquivo JSON com XStream

Ola pessoal,

Estou tentando serializar um objeto para Json com XStream do java de forma que a estrutura fique correta e completa.
Eu serializei um arquivo no formato xml e usei o site https://dataconverter.curiousconcept.com/ para converter ele para json.

Depois, eu serializei com xstream para o formato Json(JsonHierarchicalStreamDriver) e Gson(gson.toJson()).

O problema é que a estrutura do xml convertido para Json pelo site é diferente da estrutura gerada pelo Json e pelo Gson do xstream. Entretanto, as estruturas do Json e Gson gerada pelo xstream estão iguais.

Segue, na sequencia de cima pra baixo, xml gerada pelo xstream, xml convertido para Json pelo site e Json gerada pelo xstream.

<list> <Student studentId="1"> <rollNo>1</rollNo> <firstName>Mahesh</firstName> <lastName>Parashar</lastName> <className>1st</className> <address> <area>H.No. 16/3, Preet Vihar.</area> <city>Delhi</city> <state>Delhi</state> <country>India</country> <pincode>110012</pincode> </address> </Student> <Student studentId="2"> <rollNo>2</rollNo> <firstName>Mahesh</firstName> <lastName>Parashar</lastName> <className>1st</className> <address> <area>H.No. 16/3, Preet Vihar.</area> <city>Delhi</city> <state>Delhi</state> <country>India</country> <pincode>110012</pincode> </address> </Student> <Student studentId="3"> <rollNo>3</rollNo> <firstName>Mahesh</firstName> <lastName>Parashar</lastName> <className>1st</className> <address> <area>H.No. 16/3, Preet Vihar.</area> <city>Delhi</city> <state>Delhi</state> <country>India</country> <pincode>110012</pincode> </address> </Student> </list>

{
“list”: {
“Student”: [
{
“rollNo”: “1”,
“firstName”: “Mahesh”,
“lastName”: “Parashar”,
“className”: “1st”,
“address”: {
“area”: “H.No. 16/3, Preet Vihar.”,
“city”: “Delhi”,
“state”: “Delhi”,
“country”: “India”,
“pincode”: “110012”
},
@attributes”: {
“studentId”: “1”
}
},
{
“rollNo”: “2”,
“firstName”: “Mahesh”,
“lastName”: “Parashar”,
“className”: “1st”,
“address”: {
“area”: “H.No. 16/3, Preet Vihar.”,
“city”: “Delhi”,
“state”: “Delhi”,
“country”: “India”,
“pincode”: “110012”
},
@attributes”: {
“studentId”: “2”
}
},
{
“rollNo”: “3”,
“firstName”: “Mahesh”,
“lastName”: “Parashar”,
“className”: “1st”,
“address”: {
“area”: “H.No. 16/3, Preet Vihar.”,
“city”: “Delhi”,
“state”: “Delhi”,
“country”: “India”,
“pincode”: “110012”
},
@attributes”: {
“studentId”: “3”
}
}
]
}
}`

[ { "rollNo": 1, "id": 1, "firstName": "Mahesh", "lastName": "Parashar", "className": "1st", "address": { "area": "H.No. 16/3, Preet Vihar.", "city": "Delhi", "state": "Delhi", "country": "India", "pincode": 110012 } }, { "rollNo": 2, "id": 2, "firstName": "Mahesh", "lastName": "Parashar", "className": "1st", "address": { "area": "H.No. 16/3, Preet Vihar.", "city": "Delhi", "state": "Delhi", "country": "India", "pincode": 110012 } }, { "rollNo": 3, "id": 3, "firstName": "Mahesh", "lastName": "Parashar", "className": "1st", "address": { "area": "H.No. 16/3, Preet Vihar.", "city": "Delhi", "state": "Delhi", "country": "India", "pincode": 110012 } } ]

Estrutura do código:

`@XStreamAlias(“Student”)
public class Student {

private int rollNo;

@XStreamAlias("studentId")
@XStreamAsAttribute
private int id;

private String firstName;	
private String lastName;
private String className;
private Address address;	

public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

public String getFirstName() {
	return firstName;
}

public void setFirstName(String firstName) {
	this.firstName = firstName;
}

public String getLastName() {
	return lastName;
}

public void setLastName(String lastName) {
	this.lastName = lastName;
}

public int getRollNo() {
	return rollNo;
}

public void setRollNo(int rollNo) {
	this.rollNo = rollNo;
}

public String getClassName() {
	return className;
}

public void setClassName(String className) {
	this.className = className;
}

public Address getAddress() {
	return address;
}

public void setAddress(Address address) {
	this.address = address;
}

public class XStreamTester {

public static void main(String args[]) {

ArrayList objectList2 = new ArrayList();
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new DomDriver());
xstream.autodetectAnnotations(true);
xstream.setMode(XStream.NO_REFERENCES);

XStream xstreamJson = new XStream(new JsonHierarchicalStreamDriver() {

			public HierarchicalStreamWriter createWriter(Writer writer) {
				return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
			}
		});	  

objectList2 = tester.getStudentDetails(3);

String xml = xstream.toXML(objectList2);
System.out.println(“xml do student:\n” +xml + “\n”);

      //Object to Json version using GSON
      Gson gson = new Gson();	      
      String json = gson.toJson(objectList2);
      System.out.println(json + "\n");

}

private ArrayList getStudentDetails(int contador) {

	  Student student = null;
	  Address address = null;
	  ArrayList<Object> objectList = new  ArrayList<Object>();
	  int contadorr = 1;
	  
	  while(contadorr <= contador) {		
		  
      System.out.println(contadorr + " " + contador);
      student = new Student();
      address = new Address();
	  student.setId(contadorr);
      student.setFirstName("Mahesh");
      student.setLastName("Parashar");
      student.setRollNo(contadorr);
      student.setClassName("1st");
     
      address.setArea("H.No. 16/3, Preet Vihar.");
      address.setCity("Delhi");
      address.setState("Delhi");
      address.setCountry("India");
      address.setPincode(110012);
      student.setAddress(address);
      contadorr++;
      objectList.add(student);	      
	  }
      return objectList;
   }

}
`

Pelo que eu analisei o seu código que você gera o json , o objeto é uma lista logo o colchetes vai aparecer já o que foi gerado pelo site o colchetes não aparece, pois ele considera o “list” como um item do json não sei se vc percebeu isso. O que eu fiz para ficar parecido foi:

criei o primeiro nivel (“list”) da lista com um atributo list_2 que ira armazenar o arraylist, inseri uma anotação do Gson nesse atributo com nome de “list”

    @XStreamAlias("list1")
    public static class List_1{
    @SerializedName("list")
@Expose(deserialize = false)        
    private List_2 list_2;

    public List_1(List_2 list_2) {
        this.list_2 = list_2;
    }
    
    

    /**
     * @return the list_2
     */
    public List_2 getList_2() {
        return list_2;
    }

    /**
     * @param list_2 the list_2 to set
     */
    public void setList_2(List_2 list_2) {
        this.list_2 = list_2;
    }
}

Criei um segundo nivel que é o “student”, nome que ira ser gerado no gson vai ser student mesmo nao preciso colocar anotacao do Gson

   @XStreamAlias("list2")
   public static class List_2{
    private List<Student> student;

    public List_2(List<Student> student) {
        this.student = student;
    }

    
    
    /**
     * @return the student
     */
    public List<Student> getStudent() {
        return student;
    }

    /**
     * @param student the student to set
     */
    public void setStudent(List<Student> student) {
        this.student = student;
    }
}

Na minha opinião a conversão do objeto arraylist para json esta correta, já a do xml para json é outra historia. O xml esta com uma tag a mais fazendo com que ele vire um item e nao colchetes.Por isso que essas duas formas de conversão não se parecem. O que eu fiz para funcionar foi uma adaptação. Espero ter esclarecido.

Pra usar o código:

    Gson gson = new Gson();	      
    String json = gson.toJson(new List_1(new List_2(a)));
    System.out.println(json + "\n");