簡體   English   中英

如何使用gson庫准備json文件

[英]how to prepare json file using gson library

我有兩個普通的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文件。

問題中的示例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構建一個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;}
}

當然,可以從原始Java數據結構構造一個JsonElement樹,然后操縱JSON樹以匹配所需的輸出,並最終對其進行序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM