Conversion de données JSON en objet Java


Je veux pouvoir accéder aux propriétés à partir d'une chaîne JSON dans ma méthode d'action Java. La chaîne est disponible en disant simplement myJsonString = object.getJson(). Voici un exemple de ce à quoi la chaîne peut ressembler:

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

Dans cette chaîne, chaque objet JSON contient un tableau d'autres objets JSON. L'intention est d'extraire une liste d'ID où tout objet donné possédant une propriété group qui contient d'autres objets JSON. J'ai regardé Gson de Google comme un plugin JSON potentiel. Quelqu'un peut-il offrir une forme de conseils sur la façon dont je peux générer Java à partir de cette chaîne JSON?

Author: nabster, 2009-11-06

12 answers

J'ai regardé Gson de Google comme un plugin JSON potentiel. Quelqu'un peut-il offrir une forme de conseils sur la façon dont je peux générer Java à partir de cette chaîne JSON?

Google Gson prend en charge les génériques et imbriqués les haricots. Le [] dans JSON représente un tableau et doit correspondre à une collection Java telle que List ou juste un tableau Java simple. Le {} dans JSON représente un objet et doit correspondre à un Java Map ou juste un JavaBean classe.

Vous avez un objet JSON avec plusieurs propriétés dont la propriété groups représente un tableau d'objets imbriqués du même type. Cela peut être analysé avec Gson de la manière suivante:

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

Assez simple, n'est-ce pas? Il suffit d'avoir un JavaBean approprié et d'appeler Gson#fromJson().

Voir aussi:

  • Json.org - Introduction à JSON
  • Il s'agit d'un guide de l'utilisateur Gson.]}
 341
Author: BalusC, 2020-06-20 09:12:55

Bewaaaaare de Gson! C'est très cool, très génial, mais à la seconde où vous voulez faire autre chose que de simples objets, vous pourriez facilement avoir besoin de commencer à construire vos propres sérialiseurs (ce qui n'est pas that hard).

De plus, si vous avez un tableau d'objets et que vous désérialisez du json dans ce tableau d'objets, les vrais types sont PERDUS! Les objets complets ne seront même pas copiés! Utilisez XStream.. Qui, si vous utilisez le jsondriver et définissez les paramètres appropriés, encodera les types laids dans le json réel, afin que vous ne perdiez rien. Un petit prix à payer (laid json) pour une véritable sérialisation.

Remarque que Jackson résout ces problèmes, et est rapidement que GSON.

 47
Author: Jor, 2013-01-22 18:43:21

Curieusement, le seul processeur JSON décent mentionné jusqu'à présent a été GSON.

Voici plus de bons choix:

MODIFIER (août/2013):

Un de plus à considérer:

  • Genson functionality fonctionnalité similaire à Jackson, visant à être plus facile à configurer par le développeur
 26
Author: StaxMan, 2015-02-25 11:12:50

Ou avec Jackson:

String json = "...
ObjectMapper m = new ObjectMapper();
Set<Product> products = m.readValue(json, new TypeReference<Set<Product>>() {});
 17
Author: Gene De Lisa, 2011-06-22 16:15:11

Si, par un changement, vous êtes dans une application qui utilise déjà http://restfb.com/, alors vous pouvez faire:

import com.restfb.json.JsonObject;

...

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

Etc.

 7
Author: cherouvim, 2011-03-31 13:13:44

Code java facile et fonctionnel pour convertir JSONObject en Java Object

Employé.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());

    }
}
 5
Author: Rahul Raina, 2016-04-27 07:25:21
HashMap keyArrayList = new HashMap();
Iterator itr = yourJson.keys();
while (itr.hasNext())
{
    String key = (String) itr.next();
    keyArrayList.put(key, yourJson.get(key).toString());
}
 5
Author: HEAT, 2019-06-11 16:42:07

Si vous utilisez n'importe quel type de cartes spéciales avec des clés ou des valeurs également de cartes spéciales, vous constaterez que ce n'est pas envisagé par l'implémentation de Google.

 3
Author: Juanma, 2010-04-23 21:36:15

Quel est le problème avec les trucs standard?

JSONObject jsonObject = new JSONObject(someJsonString);
JSONArray jsonArray = jsonObject.getJSONArray("someJsonArray");
String value = jsonArray.optJSONObject(i).getString("someJsonValue");
 2
Author: Kevin, 2013-10-23 14:06:06

Essayez boon:

Https://github.com/RichardHightower/boon

Il est méchant rapide:

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

Ne me croyez pas sur parole... consultez le benchmark gatling.

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

(Jusqu'à 4x est certains cas, et sur les 100 de test. Il dispose également d'un mode de superposition d'index qui est encore plus rapide. Il est jeune mais en a déjà utilisateur.)

Il peut analyser JSON en Cartes et listes plus rapidement que toute autre bibliothèque peut analyser en un DOM JSON et c'est sans mode de superposition d'index. Avec le mode de superposition d'index Boon, c'est encore plus rapide.

Il a également un mode JSON lax très rapide et un mode d'analyseur PLIST. :) (et a une mémoire super faible, directement à partir du mode octets avec encodage UTF-8 à la volée).

Il a également le mode JSON vers JavaBean le plus rapide.

C'est nouveau, mais si la vitesse et l'API simple sont ce que vous recherchez, Je ne pense pas qu'il existe une API plus rapide ou plus minimaliste.

 0
Author: RickHigh, 2013-12-14 07:38:26

Le moyen le plus simple est d'utiliser cette méthode softconvertvalue qui est une méthode personnalisée dans laquelle vous pouvez convertir jsonData en votre classe Dto spécifique.

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);
}
 0
Author: Dipen Chawla, 2019-06-11 16:41:19

En fonction du format JSON d'entrée(chaîne/fichier), créez un jSONString. Exemple d'objet de classe de message correspondant à JSON peut être obtenu comme ci-dessous:

Message msgFromJSON = new ObjectMapper().readValue(jSONString, Message.class);
 0
Author: Shailendra Singh, 2020-08-11 13:03:20