2013-05-17 14 views
23

Ho bisogno di serializzare alcuni oggetti su un JSON e di inviarlo a un WebService. Come posso farlo usando la libreria org.json? O dovrò usare un altro? Qui è la classe che ho bisogno di serializzare:Come serializzare Object in 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>(); 
    } 

} 

Ho solo messo le variabili e il costruttore della classe, ma hanno anche i getter e setter. Quindi, se qualcuno può aiutare per favore

+0

e qual è il problema? – Blackbelt

+0

Sto avendo difficoltà a serializzare gli oggetti perché sono un po 'noobeo –

+0

Google sulla lib di jackson. Ti aiuterà. – user

risposta

38

Un modo semplice per farlo senza annotazioni è quello di utilizzare Gson library

Semplice come quello:

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

Grande piccola libreria e funziona con dot42 se importate jar, ma mette tutti questi '_backingFields_' nel JSON. Ho provato DataMembers ma non ha aiutato. Così sono tornato a 'StringBuilder' e l'ho fatto in modo KISS. – ppumkin

+1

È ottimo per oggetti di piccole dimensioni. Un sacco di problemi si verificano quando gli oggetti sono complessi, specialmente se oggetti figlio di riferimento dell'oggetto padre – MFARID

+0

@MFARID sapresti di un'alternativa per Android? come JSON.Net è per .Net? –

6

Il modo più veloce e semplice che ho trovato per POJO JSON-Ify è quello di utilizzare il Gson library. This blog post fornisce una rapida panoramica sull'utilizzo della libreria.

3

a fare la richiesta 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(); 

Hai letto il buffer

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

Creare un JSONObject e passare la stringa risultato il costruttore:

JSONObject json = new JSONObject(result); 

analizzare i risultati JSON per le variabili desiderati:

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

Non dimenticare di importare:

import org.json.JSONObject; 
+0

Questo soluzioone ha prestazioni davvero scadenti su Android (beh, non parliamo di qualche piccolo JSON, in questo caso non importa - ma le quantità di dati piccoli tendono a crescere) - stai allocando troppi oggetti (JSON PArser utilizza il modello DOM) e memoria. Dovrai andare in modalità parser pull senza allocare buffer. Anche GSON ir JAckson è tuo amico qui –

+0

Sto usando questo codice in alcune app di produzione e funziona come un incantesimo, e non hai bisogno di usare librerie di terze parti. –

+0

Senza dubbio questo approccio funziona. Funziona come fascino per il piccolo apprezzamento di JSON. Ho anche usato questo approccio, ma ora le mie liste higscore sono più grandi e l'allocazione del buffer di riserva, dell'albero DOM e quindi l'analisi delle entità JSON sono diventate inutilizzabili. Ora non alloco i buffer e uso solo parser di pull con databindung homegrown. –

3

GSON è facile da usare e ha un'impronta di memoria relativamente piccola. Se Loke di avere ancora più piccolo ingombro, si può afferrare:

https://github.com/ko5tik/jsonserializer

Il che è molto piccolo wrapper ridotta librerie GSON per appena POJO

2

L'implementazione Java "di riferimento" di Sean Leary è here on github. Assicurati di avere la versione più recente - dal 2009 diverse librerie estraggono versioni obsolete buggy

Java EE 7 ha un'API JSON in javax.json, vedere Javadoc. Da quello che posso dire, non ha un metodo semplice per eseguire il marshalling di qualsiasi oggetto su JSON, è necessario creare uno JsonObject o uno 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(); 

ma suppongo le altre librerie come GSON dovrà adattatori per creare oggetti che attuano tali interfacce.

0

Dopo JAVAEE8 pubblicato, è ora possibile utilizzare il nuovo JavaEE API JSON-B (JSR367)

Maven dipendenza:

<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> 

Ecco il codice snapshot:

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

JSON-P è anche aggiornato a 1.1 e più facile da usare. JSON-P 1.1 (JSR374)

Maven dipendenza:

<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> 

Ecco l'eseguibile snapshot Codice:

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