2

我有两个普通的 pojo 对象:

前任:

class person{
  private String name;
  private String id;
}
class address{
  private String homeaddress;
  private String officeaddress;
}

如何使用Gson库创建 JSON 文件,如下所示:

{
    "person": [{name:"test",id:1}]
    "address": { homeaddress:testtt, "officeaddress":testzzzz}    
}

如何使用 Gson.tojson 方法准备 JSON 文件。

4

1 回答 1

5

问题中的示例 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 类结构,并且您只能使用原始类,那么您可以使用 a 一次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 树以匹配所需的输出,最后将其序列化。

于 2011-06-09T16:21:00.303 回答