web-dev-qa-db-fra.com

Comment trouver le nom spécifié et sa valeur dans une chaîne JSON à partir de Java?

Supposons que nous ayons la prochaine chaîne JSON:

{  
   "name" : "John",
   "age" : "20",
   "address" : "some address",
   "someobject" : {
       "field" : "value"    
   }
}

Quelle est la façon la plus simple (mais toujours correcte, c'est-à-dire que les expressions régulières ne sont pas acceptables) de trouver le champ age et sa valeur (ou de déterminer qu'il n'y a pas de champ avec un nom donné)?

p.s. toutes les bibliothèques open source sont correctes.

p.s.2: s'il vous plaît, ne postez pas de liens vers les bibliothèques - ce n'est pas une réponse utile. "Montrez-moi le code" (c).

29
Roman

Utilisez une bibliothèque JSON pour analyser la chaîne et récupérer la valeur.

L'exemple très basique suivant utilise le intégré analyseur JSON d'Android.

String jsonString = "{ \"name\" : \"John\", \"age\" : \"20\", \"address\" : \"some address\" }";
JSONObject jsonObject = new JSONObject(jsonString);
int age = jsonObject.getInt("age");

Des bibliothèques JSON plus avancées, telles que jackson , google-gson , json-io ou genson , vous permettent de convertir des objets JSON en Java objets directement.

28
devconsole

Gson permet l'une des solutions les plus simples possibles. Par rapport à des API similaires comme Jackson ou svenson, Gson par défaut n'a même pas besoin des éléments JSON inutilisés pour avoir des liaisons disponibles dans la structure Java. Spécifique à la question posée, voici une solution de travail.

import com.google.gson.Gson;

public class Foo
{
  static String jsonInput = 
    "{" + 
      "\"name\":\"John\"," + 
      "\"age\":\"20\"," + 
      "\"address\":\"some address\"," + 
      "\"someobject\":" +
      "{" + 
        "\"field\":\"value\"" + 
      "}" + 
    "}";

  String age;

  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    Foo thing = gson.fromJson(jsonInput, Foo.class);
    if (thing.age != null)
    {
      System.out.println("age is " + thing.age);
    }
    else
    {
      System.out.println("age element not present or value is null");
    }
  }
}
9
Programmer Bruce

Je conviens que le Gson de Google est clair et facile à utiliser. Mais vous devez créer une classe de résultats pour obtenir une instance à partir d'une chaîne JSON. Si vous ne pouvez pas clarifier la classe de résultat, utilisez json-simple:

// import static org.hamcrest.CoreMatchers.is;
// import static org.junit.Assert.assertThat;
// import org.json.simple.JSONObject;
// import org.json.simple.JSONValue;
// import org.junit.Test;

@Test
public void json2Object() {
    // given
    String jsonString = "{\"name\" : \"John\",\"age\" : \"20\","
            + "\"address\" : \"some address\","
            + "\"someobject\" : {\"field\" : \"value\"}}";

    // when
    JSONObject object = (JSONObject) JSONValue.parse(jsonString);

    // then
    @SuppressWarnings("unchecked")
    Set<String> keySet = object.keySet();
    for (String key : keySet) {
        Object value = object.get(key);
        System.out.printf("%s=%s (%s)\n", key, value, value.getClass()
                .getSimpleName());
    }

    assertThat(object.get("age").toString(), is("20"));
}

Avantages et inconvénients de Gson et json-simple est à peu près comme le pour et le contre de la définition de l'utilisateur Java Object et Map. L'objet que vous définissez est clair pour tous les champs (nom et type), mais moins flexible que Map.

6
philipjkim