Пример JSON в вопросе недействителен.
Я предполагаю, что вместо этого используется JSON следующего формата.
{
"person":[{"name":"test","id":1}],
"address":{"homeaddress":"testtt","officeaddress":"testzzzz"}
}
С Gson вам желательноиспользовать структуру данных Java, которая точно соответствует JSON.Вот такой пример.
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
public class Foo
{
public static void main(String[] args)
{
Person person = new Person("name1", 1);
List<Person> personList = new ArrayList<Person>(1);
personList.add(person);
Address address = new Address("home1", "office1");
Thing thing = new Thing(personList, address);
Gson gson = new Gson();
String json = gson.toJson(thing);
System.out.println(json);
}
}
class Thing
{
private List<Person> person;
private Address address;
Thing(List<Person> person, Address address)
{
this.person = person;
this.address = address;
}
}
class Person
{
private String name;
private int id;
Person(String name, int id)
{
this.name = name;
this.id = id;
}
}
class Address
{
private String homeaddress;
private String officeaddress;
Address(String homeaddress, String officeaddress)
{
this.homeaddress = homeaddress;
this.officeaddress = officeaddress;
}
}
Если невозможно иметь структуру классов Java, которая соответствует целевой структуре JSON, и вы застряли только с оригинальными классами, тогда вы можете использовать JsonWriter
для построения одного токена JSON за раз.Вот пример.
public static void main(String[] args) throws Exception
{
Person person = new Person("name1", 1);
Address address = new Address("home1", "office1");
StringWriter out = new StringWriter();
JsonWriter writer = new JsonWriter(out);
writer.setIndent(" ");
writer.beginObject();
writer.name("person");
writer.beginArray().beginObject();
writer.name("name").value(person.getName());
writer.name("id").value(person.getId());
writer.endObject().endArray();
writer.name("address");
writer.beginObject();
writer.name("homeaddress").value(address.getHomeaddress());
writer.name("officeaddress").value(address.getOfficeaddress());
writer.endObject();
writer.endObject();
writer.close();
System.out.println(out);
}
Для полноты картины я также укажу, что для решения этой проблемы можно использовать простой настраиваемый сериализатор.
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
public class Foo
{
public static void main(String[] args) throws Exception
{
Person person = new Person("name1", 1);
Address address = new Address("home1", "office1");
SomeContainer thing = new SomeContainer(person, address);
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Person.class, new MyCustomSerializer());
Gson gson = gsonBuilder.create();
System.out.println(gson.toJson(thing));
}
}
class MyCustomSerializer implements JsonSerializer<Person>
{
@Override
public JsonElement serialize(Person src, Type typeOfSrc, JsonSerializationContext context)
{
List<Person> personList = new ArrayList<Person>();
personList.add(src);
return new Gson().toJsonTree(src);
}
}
class SomeContainer
{
Person person;
Address address;
SomeContainer(Person p, Address a) {person = p; address = a;}
}
class Person
{
private String name;
private int id;
Person(String n, int i) {name = n; id = i;}
}
class Address
{
private String homeaddress;
private String officeaddress;
Address(String h, String o) {homeaddress = h; officeaddress = o;}
}
И, конечно,можно создать дерево JsonElement
из исходной структуры данных Java, затем манипулировать деревом JSON для соответствия требуемому выводу и, наконец, сериализовать его.