Frage

Ich möchte in der Lage sein, Objekte für den Zugriff auf von einem JSON-String in meiner Java Aktionsmethode. Der String ist durch ein einfaches myJsonString = object.getJson() zur Verfügung. Unten ist ein Beispiel dafür, was die Zeichenfolge wie folgt aussehen kann:

{
    'title': 'ComputingandInformationsystems',
    'id': 1,
    'children': 'true',
    'groups': [{
        'title': 'LeveloneCIS',
        'id': 2,
        'children': 'true',
        'groups': [{
            'title': 'IntroToComputingandInternet',
            'id': 3,
            'children': 'false',
            'groups': []
        }]
    }]
}

In dieser Zeichenfolge jedes JSON-Objekt eine Reihe von anderen JSON-Objekten enthält. Die Absicht ist es, eine Liste von IDs zu extrahieren, wo jedes gegebenen Objekt eine Gruppe Eigenschaft besitzen, die anderen JSON-Objekte enthält. Ich schaute auf Googles Gson als potenzielle JSON-Plugin. Kann jemand irgendeine Form von Beratung bieten, wie ich Java aus diesem JSON-String erzeugen kann?

War es hilfreich?

Lösung

  

Ich schaute auf Googles Gson als potenzielle JSON-Plugin. Kann jemand irgendeine Form von Beratung bieten, wie ich Java aus diesem JSON-String erzeugen kann?

Google Gson Generika und verschachtelt Bohnen unterstützt. Die [] in JSON stellt ein Array und sollte auf einer Java-Sammlung wie List oder nur ein einfacher Java-Array. Die {} in JSON repräsentiert ein Objekt und sollte auf ein Java Karte Map oder nur einige JavaBean-Klasse.

Sie haben ein JSON-Objekt mit mehreren Eigenschaften, von denen die groups Eigenschaft eine Reihe von verschachtelten Objekten des gleichen Typs darstellt. Dies kann mit Gson die folgende Art und Weise analysiert werden:

package com.stackoverflow.q1688099;

import java.util.List;
import com.google.gson.Gson;

public class Test {

    public static void main(String... args) throws Exception {
        String json = 
            "{"
                + "'title': 'Computing and Information systems',"
                + "'id' : 1,"
                + "'children' : 'true',"
                + "'groups' : [{"
                    + "'title' : 'Level one CIS',"
                    + "'id' : 2,"
                    + "'children' : 'true',"
                    + "'groups' : [{"
                        + "'title' : 'Intro To Computing and Internet',"
                        + "'id' : 3,"
                        + "'children': 'false',"
                        + "'groups':[]"
                    + "}]" 
                + "}]"
            + "}";

        // Now do the magic.
        Data data = new Gson().fromJson(json, Data.class);

        // Show it.
        System.out.println(data);
    }

}

class Data {
    private String title;
    private Long id;
    private Boolean children;
    private List<Data> groups;

    public String getTitle() { return title; }
    public Long getId() { return id; }
    public Boolean getChildren() { return children; }
    public List<Data> getGroups() { return groups; }

    public void setTitle(String title) { this.title = title; }
    public void setId(Long id) { this.id = id; }
    public void setChildren(Boolean children) { this.children = children; }
    public void setGroups(List<Data> groups) { this.groups = groups; }

    public String toString() {
        return String.format("title:%s,id:%d,children:%s,groups:%s", title, id, children, groups);
    }
}

Ziemlich einfach, ist es nicht? Haben Sie einfach eine geeignete JavaBean und rufen Gson#fromJson() .

Siehe auch:

Andere Tipps

Bewaaaaare von Gson! Es ist sehr cool, sehr groß, aber die zweite Sie etwas wollen, dass andere als einfache Objekte zu tun, könnte man leicht starten müssen Ihre eigenen Serializer bauen (was nicht ist, dass hart).

Auch, wenn Sie eine Reihe von Gegenständen, und Sie deserialisieren einige Json in diesem Array von Gegenständen, sind die wahren Arten verloren! Die vollständigen Objekte werden nicht einmal kopiert werden! Verwenden XStream .. Welche, wenn die jsondriver verwenden und die richtigen Einstellungen Einstellung wird hässliche Typen in die eigentliche json kodieren, so dass Sie nicht verlieren alles. Ein kleiner Preis zu zahlen (hässlich json) für echte Serialisierung.

Beachten Sie, dass Jackson diese Probleme behebt, und ist schneller als Gson.

Merkwürdig ist, dass der einzige anständige JSON Prozessor bisher erwähnt wurde Gson.

Hier sind eine gute Wahl:

  • Jackson ( Github ) - leistungsstarke Datenbindung (JSON zu / von POJOs), Streaming (ultraschnelle), Baummodell (praktisch für untypisierten Zugang)
  • Flex-JSON - in hohem Maße konfigurierbar Serialisierung

EDIT (Aug / 2013):

Ein weiteres zu beachten:

  • Genson - Funktionalität ähnlich wie Jackson, soll einfacher sein, indem Entwickler zu konfigurieren

Oder mit Jackson:

String json = "...
ObjectMapper m = new ObjectMapper();
Set<Product> products = m.readValue(json, new TypeReference<Set<Product>>() {});

Wenn durch eine Änderung, sind Sie in einer Anwendung, die bereits verwendet http://restfb.com/ dann Sie tun können:

import com.restfb.json.JsonObject;

...

JsonObject json = new JsonObject(jsonString);
json.get("title");

etc.

Wenn Sie jede Art von Spezialkarten mit Schlüssel oder Werte verwenden auch spezielle Karten, werden Sie es nicht durch die Implementierung von Google in Betracht gezogen finden.

Einfache und Java-Code arbeiten JSONObject konvertieren Java Object

Employee.java

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Generated;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"id",
"firstName",
"lastName"
})
public class Employee {

@JsonProperty("id")
private Integer id;
@JsonProperty("firstName")
private String firstName;
@JsonProperty("lastName")
private String lastName;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
*
* @return
* The id
*/
@JsonProperty("id")
public Integer getId() {
return id;
}

/**
*
* @param id
* The id
*/
@JsonProperty("id")
public void setId(Integer id) {
this.id = id;
}

/**
*
* @return
* The firstName
*/
@JsonProperty("firstName")
public String getFirstName() {
return firstName;
}

/**
*
* @param firstName
* The firstName
*/
@JsonProperty("firstName")
public void setFirstName(String firstName) {
this.firstName = firstName;
}

/**
*
* @return
* The lastName
*/
@JsonProperty("lastName")
public String getLastName() {
return lastName;
}

/**
*
* @param lastName
* The lastName
*/
@JsonProperty("lastName")
public void setLastName(String lastName) {
this.lastName = lastName;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

LoadFromJSON.java

import org.codehaus.jettison.json.JSONObject;

import com.fasterxml.jackson.databind.ObjectMapper;

public class LoadFromJSON {

    public static void main(String args[]) throws Exception {
        JSONObject json = new JSONObject();
        json.put("id", 2);
        json.put("firstName", "hello");
        json.put("lastName", "world");

        byte[] jsonData = json.toString().getBytes();

        ObjectMapper mapper = new ObjectMapper();
        Employee employee = mapper.readValue(jsonData, Employee.class);

        System.out.print(employee.getLastName());

    }
}
HashMap keyArrayList = new HashMap();
Iterator itr = yourJson.keys();
while (itr.hasNext())
{
    String key = (String) itr.next();
    keyArrayList.put(key, yourJson.get(key).toString());
}

Was ist mit den Standard-Sachen falsch?

JSONObject jsonObject = new JSONObject(someJsonString);
JSONArray jsonArray = jsonObject.getJSONArray("someJsonArray");
String value = jsonArray.optJSONObject(i).getString("someJsonValue");

Geben Segen einen Versuch:

https://github.com/RichardHightower/boon

Es ist böse schnell:

https://github.com/RichardHightower/json-parsers-benchmark

Sie nicht mein Wort nehmen für sie ... die Gatling Benchmark überprüfen.

https://github.com/gatling/json-parsers-benchmark

(Bis zu 4x ist in einigen Fällen, und aus den 100s Test. Es ist auch ein Index-Overlay-Modus hat, der noch schneller ist. Es ist jung, hat aber schon einige Benutzer.)

Es kann JSON zu Maps analysieren und Listen schneller als alle anderen lib zu einem JSON-DOM analysieren kann und das ist ohne Modus-Index Overlay. Mit Boon Index Overlay-Modus ist es sogar noch schneller.

Es hat auch einen sehr schnellen JSON lax Modus und einen PLIST-Parser-Modus. :) (und hat einen super niedrigen Speicher, direkt vom Byte-Modus mit UTF-8-Codierung on the fly).

Es hat auch die schnellste JSON auch auf JavaBean-Modus.

Es ist neu, aber wenn die Geschwindigkeit und einfache API ist das, was Sie suchen, ich glaube nicht, gibt es einen schnelleren oder minimalistisch-API.

Je nach Eingang JSON-Format (string / Datei) eine jSONString erstellen. Beispielnachrichtenklasse Objekt JSON entspricht, wie weiter unten erhalten:

Nachricht msgFromJSON = new ObjectMapper () Readvalue (jSONString, Message.class);.

Der einfachste Weg ist, dass Sie diese softconvertvalue Methode verwenden können, die eine benutzerdefinierte Methode ist, in dem Sie jsonData in Ihre spezifische Dto Klasse umwandeln kann.

Dto response = softConvertValue(jsonData, Dto.class);


public static <T> T softConvertValue(Object fromValue, Class<T> toValueType) 
{
    ObjectMapper objMapper = new ObjectMapper();
    return objMapper
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .convertValue(fromValue, toValueType);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top