Java 如何将对象序列化为JSON?

Java 如何将对象序列化为JSON?,java,android,json,Java,Android,Json,我需要将一些对象序列化为JSON并发送到Web服务。如何使用org.json库实现这一点?否则我就得用另一个?下面是我需要序列化的类: public class PontosUsuario { public int idUsuario; public String nomeUsuario; public String CPF; public String email; public String sigla; public String senh

我需要将一些对象序列化为JSON并发送到Web服务。如何使用org.json库实现这一点?否则我就得用另一个?下面是我需要序列化的类:

public class PontosUsuario {

    public int idUsuario;
    public String nomeUsuario;
    public String CPF;
    public String email;
    public String sigla;
    public String senha;
    public String instituicao;

    public ArrayList<Ponto> listaDePontos;


    public PontosUsuario()
    {
        //criando a lista
        listaDePontos = new ArrayList<Ponto>();
    }

}
PontosUsuario公共类{
国际公共图书馆;
公共字符串名称;
公共字符串CPF;
公共字符串电子邮件;
公共字符串符号;
公共字符串senha;
国际民航组织公共字符串研究所;
公共ArrayList listaDePontos;
公共桥苏亚里奥()
{
//克里安多a利斯塔酒店
listaDePontos=newarraylist();
}
}

我只放置了类的变量和构造函数,但它也有getter和setter。所以,如果有人能帮上忙,请使用

简单地说:

Gson gson = new Gson();
String json = gson.toJson(listaDePontos);

我找到的最快、最简单的方法是使用。 快速概述如何使用该库

您发出http请求

你读取缓冲区

创建一个JSONObject并将结果字符串传递给构造函数:

将json结果解析为所需的变量:

不要忘记导入:

import org.json.JSONObject;

GSON易于使用,内存占用相对较小。如果您想拥有更小的占地面积,您可以:

这是一个仅用于POJO的精简GSON库的小包装器,Sean Leary的“参考”Java实现是。确保有最新的版本-不同的库拉入版本与2009年的旧版本不符

JavaEE7在
javax.JSON
中有一个JSONAPI,请参阅。据我所知,它没有简单的方法将任何对象打包成JSON,您需要构造一个
JsonObject
JsonArray

import javax.json.*;

JsonObject value = Json.createObjectBuilder()
 .add("firstName", "John")
 .add("lastName", "Smith")
 .add("age", 25)
 .add("address", Json.createObjectBuilder()
     .add("streetAddress", "21 2nd Street")
     .add("city", "New York")
     .add("state", "NY")
     .add("postalCode", "10021"))
 .add("phoneNumber", Json.createArrayBuilder()
     .add(Json.createObjectBuilder()
         .add("type", "home")
         .add("number", "212 555-1234"))
     .add(Json.createObjectBuilder()
         .add("type", "fax")
         .add("number", "646 555-4567")))
 .build();

JsonWriter jsonWriter = Json.createWriter(...);
jsonWriter.writeObject(value);
jsonWriter.close();

但我假设其他库(如GSON)将有适配器来创建实现这些接口的对象。

JAVAEE8发布后,现在可以使用新的JavaEEAPI()

Maven依赖项:

<dependency>
    <groupId>javax.json.bind</groupId>
    <artifactId>javax.json.bind-api</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>org.eclipse</groupId>
    <artifactId>yasson</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>javax.json</groupId>
    <artifactId>javax.json-api</artifactId>
    <version>1.1</version>
</dependency>

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1</version>
</dependency>
JSON-p也更新为1.1,更易于使用。()

Maven依赖项:

<dependency>
    <groupId>javax.json.bind</groupId>
    <artifactId>javax.json.bind-api</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>org.eclipse</groupId>
    <artifactId>yasson</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>javax.json</groupId>
    <artifactId>javax.json-api</artifactId>
    <version>1.1</version>
</dependency>

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1</version>
</dependency>
人们也可以使用图书馆

添加Maven依赖项:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId> 
  <artifactId>jackson-core</artifactId>
</dependency>

问题是什么?我很难序列化对象,因为我有点不知道这个解决方案在android上的性能真的很差(好吧,我们不谈论一些小的JSON,在这种情况下它不重要-但小数据量往往会增长)-您分配了太多的对象(JSON解析器使用DOM模型)还有记忆。您应该在不分配缓冲区的情况下使用pull解析器模式。另外,GSON ir JAckson是您的朋友,我在一些生产应用程序中使用此代码,它工作起来非常有魅力,您不需要使用第三方库。毫无疑问,这种方法是有效的。它的工作原理就像JSON小名称的魅力。我也使用了这种方法——但我的higscore列表现在更大了,分配备用缓冲区、DOM树以及解析JSON实体变得不可用。现在我不分配缓冲区,只对自制的DataBinding使用pull解析器。有趣的@KonstantinPribluda,在我的例子中,我不会移动太多数据。那你推荐什么方法呢?。你能给我一些链接吗?感谢Moery和objewct在android上的分配是昂贵的(比在服务器上要贵得多)。建议很简单-尽量避免内存和对象分配。使用像GSON这样的拉式解析器,并在其上使用数据绑定(可以是来自GSON的,也可以是我的小框架:-参见单元测试示例用法)非常棒的小库,如果您导入jar,它可以与dot42一起工作,但它会将所有这些
\u backingFields\u
放在JSON中。我试过DataMembers,但没用。所以我回到了
StringBuilder
,只是用KISS的方式来做。这对小尺寸的对象非常有用。当对象很复杂时会发生很多问题,尤其是当子对象引用父对象时objects@MFARID你知道安卓的替代品吗?就像JSON.Net是用于.Net的一样?我只知道Gson是由谷歌维护的,所以我采用它似乎很可靠。查看他们的用户手册,如果需要的话,定制它确实需要一些时间,编写自己的序列化程序和反序列化程序类。所需的maven依赖项是
com.fasterxml.jackson.core jackson core
知道谷歌对Android做了什么,我更喜欢这个解决方案。
Jsonb jsonb = JsonbBuilder.create();
// Two important API : toJson fromJson
String result = jsonb.toJson(listaDePontos);
<dependency>
    <groupId>javax.json</groupId>
    <artifactId>javax.json-api</artifactId>
    <version>1.1</version>
</dependency>

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1</version>
</dependency>
String data = "{\"name\":\"Json\","
                + "\"age\": 29,"
                + " \"phoneNumber\": [10000,12000],"
                + "\"address\": \"test\"}";
        JsonObject original = Json.createReader(new StringReader(data)).readObject();
        /**getValue*/
        JsonPointer pAge = Json.createPointer("/age");
        JsonValue v = pAge.getValue(original);
        System.out.println("age is " + v.toString());
        JsonPointer pPhone = Json.createPointer("/phoneNumber/1");
        System.out.println("phoneNumber 2 is " + pPhone.getValue(original).toString());
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId> 
  <artifactId>jackson-core</artifactId>
</dependency>
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString( serializableObject );