Konwertuj obiekt na JSON w systemie Android

129

Czy istnieje prosta metoda konwersji dowolnego obiektu do formatu JSON w systemie Android?

Thizzer
źródło

Odpowiedzi:

271

Większość ludzi używa gson: sprawdź to

Gson gson = new Gson();
String json = gson.toJson(myObj);
James L.
źródło
15
A także Jackson.
Mafia
4
Dlaczego nie mamy wbudowanej metody toJson? Ale mamy od fromJson?
M o
spróbuj użyć gson, które mają.
gumuruh
57
public class Producto {

int idProducto;
String nombre;
Double precio;



public Producto(int idProducto, String nombre, Double precio) {

    this.idProducto = idProducto;
    this.nombre = nombre;
    this.precio = precio;

}
public int getIdProducto() {
    return idProducto;
}
public void setIdProducto(int idProducto) {
    this.idProducto = idProducto;
}
public String getNombre() {
    return nombre;
}
public void setNombre(String nombre) {
    this.nombre = nombre;
}
public Double getPrecio() {
    return precio;
}
public void setPrecio(Double precio) {
    this.precio = precio;
}

public String toJSON(){

    JSONObject jsonObject= new JSONObject();
    try {
        jsonObject.put("id", getIdProducto());
        jsonObject.put("nombre", getNombre());
        jsonObject.put("precio", getPrecio());

        return jsonObject.toString();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return "";
    }

}
ingyesid
źródło
1
wolę ten sposób, każdy obiekt ma swoją własną metodę stringify, dziękuję za wgląd!
Bhimbim,
10

Może być lepszym wyborem:

@Override
public String toString() {
    return new GsonBuilder().create().toJson(this, Producto.class);
}
Hesam
źródło
Dlaczego to lepszy wybór?
Neria Nachum
1
Chęć przekonwertowania obiektu na ciąg JSON niekoniecznie oznacza, że ​​chcesz, aby reprezentacja ciągu obiektu zawsze była JSON.
Thizzer
@NeriaNachum, Coś mi przyszło do głowy, kiedy odpowiedziałem mając zajęcia z wieloma atrybutami. Zastąpienie tej toString()metody powoduje utworzenie wielu obiektów typu String podczas drukowania w domyślny sposób - generowany przez Android Studio lub IntelliJ Idea - jest to jednak jedna linia kodu i wykorzystująca moc GsonBuilder.
Hesam
@Thizzer, masz całkowitą rację. Pomyślałem, że dobrze jest być udostępnianym i widzianym przez programistów (przynajmniej tych, którzy nie są zaznajomieni z podejściem). Wtedy będą używać, kiedy będą potrzebować.
Hesam
Ja również uważam to za lepszy wybór, ponieważ konwersję można przeprowadzić z samego modelu, abstrahując od implementacji.
adnaan.zohran
4

Spring na Androida robi to łatwo za pomocą RestTemplate:

final String url = "http://192.168.1.50:9000/greeting";
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Greeting greeting = restTemplate.getForObject(url, Greeting.class);
Saeed Zarinfam
źródło
Nie musisz dodawać MappingJackson2HttpMessageConverter do RestTemplate, jeśli Jackson Jar znajduje się w ścieżce klas, jest dodawany automatycznie.
Klaus Groenbaek
2

Począwszy od systemu Android 3.0 (poziom interfejsu API 11) Android ma nowszy i ulepszony parser JSON.

http://developer.android.com/reference/android/util/JsonReader.html

Odczytuje wartość zakodowaną w formacie JSON (RFC 4627) jako strumień tokenów. Ten strumień zawiera zarówno wartości literalne (ciągi, liczby, wartości logiczne i wartości null), jak i początkowe i końcowe ograniczniki obiektów i tablic. Tokeny przechodzą w kolejności od początku do głębi, w tej samej kolejności, w jakiej pojawiają się w dokumencie JSON. W obiektach JSON pary nazwa / wartość są reprezentowane przez pojedynczy token.

Tłum
źródło
1
To jest przeciwieństwo tego, o co pytano.
Matthew Przeczytaj
2

pobierz bibliotekę Gradle:

compile 'com.google.code.gson:gson:2.8.2'

Aby użyć biblioteki w metodzie.

Gson gson = new Gson();

//transform a java object to json
System.out.println("json =" + gson.toJson(Object.class).toString());

//Transform a json to java object
String json = string_json;
List<Object> lstObject = gson.fromJson(json_ string, Object.class);
Faxon
źródło