2013-05-17 124 views
23

我需要序列化一些对象到JSON并发送到WebService。我怎样才能使用org.json库?或者我将不得不使用另一个?这里是我需要序列化的类:如何将对象序列化为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>(); 
    } 

} 

我只把变量和类的构造函数,但它也有getters和setter。所以,如果有人可以帮助请

+0

又有什么问题呢? – Blackbelt

+0

我很难序列化的对象,因为我是一个小noobie –

+0

谷歌有关杰克逊lib。它会帮助你。 – user

回答

38

简单的方法来做到这一点没有标注是使用Gson library

就这么简单:

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

如果你导入jar,那么它就是很棒的小型库,并且可以和dot42一起工作,但是它将所有'_backingFields_'放到JSON中。我试过DataMembers,但它没有帮助。所以我回到了'StringBuilder',只是做了KISS的方式。 – ppumkin

+1

这对小尺寸物体非常有用。当对象很复杂时会发生很多问题,特别是如果子对象引用父对象 – MFARID

+0

@MFARID,您会了解Android的替代方案吗?像JSON.Net是为.Net? –

3

你让HTTP请求

HttpResponse response = httpclient.execute(httpget);   
HttpEntity entity = response.getEntity(); 

inputStream = entity.getContent(); 

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
      StringBuilder sb = new StringBuilder(); 

您读取缓冲区

String line = null; 
while ((line = reader.readLine()) != null) 
{ 
sb.append(line + "\n"); 
} 
Log.d("Result", sb.toString()); 
result = sb.toString(); 

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

JSONObject json = new JSONObject(result); 

解析JSON结果所需的变量:

String usuario= json.getString("usuario"); 
int idperon = json.getInt("idperson"); 
String nombre = json.getString("nombre"); 

不要忘了导入:

import org.json.JSONObject; 
+0

这个solutiuon在android上的表现真的很差(呃,我们不谈论一些小的JSON,在这种情况下它并不重要 - 但小数据量往往会增长) - 你分配了太多的对象JSON分析器使用DOM模型)和内存。您应该在不分配缓冲区的情况下进入pull parser模式。 GSON ir JAckson也是您的朋友 –

+0

我在某些制作应用程序中使用此代码,它的工作方式像魅力,而且您不需要使用第三方库。 –

+0

毫无疑问,这种方法的作品。它对于少量的JSON非常有用。我也使用了这种方法 - 但是我的高分列表现在变得更大了,分配DOM树的备用缓冲区,然后分析JSON实体变得不可用。现在我不分配缓冲区,只用本地数据绑定的pull语法分析器。 –

3

GSON易于使用并具有相对较小的内存占用量。如果您魔神拥有更小的足迹,你可以抓住:

https://github.com/ko5tik/jsonserializer

这是很小的包装器剥离下来GSON库只是的POJO

2

由肖恩·利里的“基准”的Java实现here on github。请确保拥有最新版本 - 不同的库从2009年起提供版本buggy旧版本。

Java EE 7在javax.json中有一个JSON API,请参阅Javadoc。从我所知道的情况来看,它没有简单的方法将任何对象编组为JSON,您需要构造一个JsonObjectJsonArray

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将有适配器来创建实现这些接口的对象。

0

JAVAEE8发布后,现在你可以使用新的JAVAEE API JSON-BJSR367

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> 

下面是一些代码快照:

Jsonb jsonb = JsonbBuilder.create(); 
// Two important API : toJson fromJson 
String result = jsonb.toJson(listaDePontos); 

JSON-P也更新到1.1,更易于使用。 JSON-P 1.1JSR374

Maven的依赖性:

<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());