het converteren van JSON-gegevens naar Java-object

Ik wil in staat zijn om toegang te krijgen tot eigenschappen van een JSON-string binnen mijn Java Action-methode. De tekenreeks is beschikbaar door simpelweg te zeggen myJsonString = object.getJson(). Hieronder is een voorbeeld van wat de reeks eruit kan zien:

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

In deze reeks bevat elk JSON-object een reeks andere JSON-objecten. Het is de bedoeling om een ​​lijst met ID’s te extraheren waar een bepaald object dat een groepsobject bezit die andere JSON-objecten bevat. Ik keek naar Google’s GSON als een potentiële JSON-plug-in. Kan iemand een vorm van begeleiding bieden over hoe ik Java kan genereren uit deze JSE-string?


Antwoord 1, Autoriteit 100%

Ik keek naar Google’s GSON als een potentiële JSON-plug-in. Kan iemand een vorm van begeleiding bieden over hoe ik Java kan genereren uit deze JSE-string?

Google GSON ondersteunt generieke en geneste bonen. De []in JSON vertegenwoordigt een array en zou moeten aanwijzen aan een Java-collectie, zoals Listof gewoon een gewone java-array. De {}in JSON vertegenwoordigt een object en moet aan een Java Mapof gewoon een javabean-klasse.

U hebt een JSON-object met verschillende eigenschappen waarvan de groupseigenschap een reeks geneste objecten van hetzelfde type vertegenwoordigt. Dit kan worden geparseerd met GSO, de volgende manier:

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

Behoorlijk eenvoudig, niet? Neem gewoon een geschikte JavaBean en bel Gson#fromJson().

Zie ook:


Antwoord 2, autoriteit 14%

Bewaaaaare van Gson! Het is heel cool, heel geweldig, maar zodra je iets anders wilt doen dan eenvoudige objecten, zou je gemakkelijk je eigen serializers kunnen gaan bouwen (wat niet zomoeilijk is).

Als je een array van objecten hebt, en je deserialiseert een json in die array van objecten, zijn de echte typen VERLOREN! De volledige objecten worden niet eens gekopieerd! Gebruik XStream.. Die, als je de jsondriver gebruikt en de juiste instellingen instelt, lelijke typen in de eigenlijke json zal coderen, zodat je niets verliest. Een kleine prijs om te betalen (lelijke json) voor echte serialisatie.

Merk op dat Jacksondeze problemen oplost en snellerdan GSON.


Antwoord 3, autoriteit 8%

Vreemd genoeg is GSON de enige fatsoenlijke JSON-processor die tot nu toe is genoemd.

Hier zijn meer goede keuzes:

  • jackson (Github ) – Krachtige gegevensbinding (JSON van / van Pojos), streaming (ultra fast), boommodel (handig voor niet-toegestane toegang)
  • flex-json – Zeer configureerbare serialisatie

EDIT (AUG / 2013):

Nog één om te overwegen:

  • Genson – Functionaliteit vergelijkbaar met Jackson, gericht op het gemakkelijker te configureren door ontwikkelaar

Antwoord 4, Autoriteit 5%

of met jackson:

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

Antwoord 5, Autoriteit 2%

Als u door een wijziging in een toepassing bent die u al gebruikt http://restfb.com/ dan U kunt doen:

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

enz.


Antwoord 6, Autoriteit 2%

Eenvoudige en werkende Java-code om te converteren JSONObjectNAAR Java Object

werknemer.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());
    }
}

Antwoord 7

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

Antwoord 8

Als u speciale kaarten gebruikt met sleutels of waarden, ook van speciale kaarten, zult u merken dat dit niet wordt overwogen door de implementatie van Google.


Antwoord 9

Wat is er mis met de standaard dingen?

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

Antwoord 10

Probeer boon eens:

https://github.com/RichardHightower/boon

Het is slecht snel:

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

Geloof me niet op mijn woord… bekijk de gatling-benchmark.

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

(Tot 4x is in sommige gevallen, en uit de 100s van de test. Het heeft ook een index-overlay-modus die nog sneller is. Het is jong maar heeft al enkele gebruikers.)

Het kan JSON sneller naar kaarten en lijsten parseren dan welke andere lib dan ook naar een JSON DOM en dat is zonder Index Overlay-modus. Met de Boon Index Overlay-modus is het nog sneller.

Het heeft ook een zeer snelle JSON lax-modus en een PLIST-parsermodus. 🙂 (en heeft een superlaag geheugen, direct vanuit bytes-modus met UTF-8-codering on-the-fly).

Het heeft ook de snelste JSON naar JavaBean-modus.

Het is nieuw, maar als snelheid en eenvoudige API is wat je zoekt, denk ik niet dat er een snellere of meer minimalistische API is.


Antwoord 11

De eenvoudigste manier is dat u deze softconvertvalue-methode kunt gebruiken, een aangepaste methode waarmee u jsonData kunt converteren naar uw specifieke Dto-klasse.

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

Antwoord 12

Afhankelijk van de invoer JSON-indeling (tekenreeks/bestand) maakt u een jSONString. Een voorbeeldklasse-object voor berichten dat overeenkomt met JSON kan als volgt worden verkregen:

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

Other episodes