2

2つのプレーンポジョオブジェクトがあります。

元:

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 クラス構造を持つことができず、元のクラスしか残っていない場合は、 を使用し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 ツリーを操作して目的の出力に一致させ、最終的にそれをシリアル化することもできます。

于 2011-06-09T16:21:00.303 に答える