質問の JSON の例は無効です。
代わりに、次の形式の JSON がターゲットになっていると仮定します。
{
"person":[{"name":"test","id":1}],
"address":{"homeaddress":"testtt","officeaddress":"testzzzz"}
}
Gson では、JSON と正確に一致する Java データ構造を使用することをお勧めします。これがその例です。
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;
}
}
ターゲットの JSON 構造に一致する Java クラス構造を持つことができず、元のクラスしか残っていない場合は、 を使用しJsonWriter
て一度に 1 つのトークンずつ 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 ツリーを操作して目的の出力に一致させ、最終的にそれをシリアル化することもできます。