2013-05-17 168 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());