web-dev-qa-db-fra.com

Comment créer un objet json complexe en java?

J'essaie de créer cet objet JSON en Java et en difficulté:

{
    "notification": {
        "message": "test",
        "sound": "sounds/alarmsound.wav",
        "target": {
            "apps": [
                {
                    "id": "app_id",
                    "platforms": [
                        "ios"
                    ]
                }
            ]
        }
    },
    "access_token": "access_token"
}

Toute aide sur la manière de créer cela en Java serait appréciée!

16
pixelworlds

Si vous cherchez vraiment dans créer objets JSON, Jackson a tout ce que vous voulez:

final JsonNodeFactory factory = JsonNodeFactory.instance;

final ObjectNode node = factory.objectNode();

final ObjectNode child = factory.objectNode(); // the child

child.put("message", "test");

// etc etc

// and then:

node.set("notification", child); // node.put(String, ObjectNode) has been deprecated

La node résultante est une ObjectNode, qui hérite de JsonNode, ce qui signifie que vous obtenez toutes les subtilités de JsonNode:

  • une représentation sensible .toString();
  • capacités de navigation (.get(), .path() - GSON n’a pas d’équivalent pour cela, en particulier pas .path(), car il ne peut pas modéliser un nœud manquant);
  • MissingNode pour représenter un nœud absent et NullNode pour représenter JSON null, héritant tous de JsonNode (GSON n'a pas d'équivalent pour cela - et toutes les méthodes de navigation de JsonNode sont également disponibles sur de tels nœuds);
  • et bien sûr, .equals()/.hashCode().
40
fge

Pour ceux qui essaient d'utiliser les réponses de ce fil, notez que

JsonNodeFactory nodeFactory = new JsonNodeFactory();

Ne fonctionne plus avec le paquet jackson-databind. Au lieu de cela, vous devriez faire

final JsonNodeFactory nodeFactory = JsonNodeFactory.instance;

Voir cette réponse: https://stackoverflow.com/a/16974850/3824918

23
Cithel
JSONObject jsonComplex = new JSONObject();
    JSONObject notification = new JSONObject();
    notification.put("message", "test");
    notification.put("sound", "sounds_alarmsound.wav");
    JSONObject targetJsonObject= new JSONObject();
    JSONArray targetJsonArray= new JSONArray();
    JSONObject appsJsonObject= new JSONObject();
    appsJsonObject.put("id","app_id");
    JSONArray platformArray = new JSONArray();
    platformArray.add("ios");
    appsJsonObject.put("platforms",platformArray);
    targetJsonArray.add(appsJsonObject);
    targetJsonObject.put("apps", targetJsonArray);
    notification.put("target", targetJsonObject);
    jsonComplex.put("notification", notification);
    jsonComplex.put("access_token", "access_token");
    System.out.println(jsonComplex);
8
Soumya

Merci à @fge qui a fourni les informations nécessaires pour résoudre ce problème. 

Voici ce que j'ai fait pour résoudre ce problème!

JsonNodeFactory nodeFactory = new JsonNodeFactory ();

        ObjectNode pushContent = nodeFactory.objectNode();
        ObjectNode notification = nodeFactory.objectNode();
        ObjectNode appsObj = nodeFactory.objectNode();
        ObjectNode target = nodeFactory.objectNode();

        ArrayNode apps = nodeFactory.arrayNode();
        ArrayNode platforms = nodeFactory.arrayNode();

        platforms.add("ios");

        appsObj.put("id","app_id");
        appsObj.put("platforms",platforms);

        apps.add(appsObj);

        notification.put("message",filledForm.field("text").value());
        notification.put("sound","sounds/alarmsound.wav");
        notification.put("target", target);

        target.put("apps",apps);

        pushContent.put("notification", notification);
        pushContent.put("access_token","access_token");

        if(!filledForm.field("usage").value().isEmpty()) {
            target.put("usage",filledForm.field("usage").value());
        }

        if(!filledForm.field("latitude").value().isEmpty() && !filledForm.field("longitude").value().isEmpty() && !filledForm.field("radius").value().isEmpty()) {
            target.put("latitude",filledForm.field("latitude").value());
            target.put("longitude",filledForm.field("longitude").value());
            target.put("radius",filledForm.field("radius").value());
        }

L'impression de pushContent à la sortie de l'objet json exact que je devais créer! 

J'espère que cela aide quelqu'un d'autre aussi!

Riches

3
pixelworlds

Je préfère créer des classes représentant cet objet et le convertir en JSON. Je suppose que vous avez cette interface JSON ailleurs et que vous avez beaucoup à faire pour la créer à partir de Java.

class ToJson{
    private Notification notification;
    private String access_token;
}

public class Notification{
    private String message;
    private String sound;
    private Target target;
}

public class Target{
    private Apps apps[];
}

public class Apps{
    private String id;
    private Plataform plataforms[];
}

public class Plataform{
    privte String ios;
}

Ensuite, vous convertissez un objet ToJson rempli en JSON en utilisant la lib/framework de votre choix.

2
Hikari

Il existe une variété de bibliothèques qui peuvent vous aider ici.

Si vous rencontrez des problèmes plus spécifiques avec ces bibliothèques, vous devez les poster.

0
Jeff Storey