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