如何在java中创建复杂的json对象?

时间:2013-01-08 04:16:59

标签: java json jackson

我正在尝试在java中创建这个json对象并且苦苦挣扎:

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

任何人如何在java中创建它的帮助将不胜感激!

6 个答案:

答案 0 :(得分:41)

如果你真的在研究创建 JSON对象,杰克逊有你想要的一切:

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

结果nodeObjectNode,继承JsonNode,这意味着您可以获得所有JsonNode的细节:

  • 明智的.toString()代表;
  • 导航功能(.get().path() - GSON没有相应的功能,特别是.path(),因为它无法为缺少的节点建模;)
  • MissingNode表示不存在的节点,NullNode表示JSON null,所有节点都继承JsonNode(GSON没有相应的 - 并且全部JsonNode的导航方法可在此类节点上使用);
  • 当然还有.equals() / .hashCode()

答案 1 :(得分:23)

对于那些尝试使用此主题的答案的人,请注意

JsonNodeFactory nodeFactory = new JsonNodeFactory();

使用包jackson-databind不再工作了。相反,你应该做

final JsonNodeFactory nodeFactory = JsonNodeFactory.instance;

请参阅此答案:https://stackoverflow.com/a/16974850/3824918

答案 2 :(得分:8)

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

答案 3 :(得分:3)

感谢@fge为我提供了解决此问题的必要信息。

这就是我为解决这个问题所做的一切!

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

打印pushContent而不是输出我需要创建的确切json对象!

希望这也可以帮助其他人!

答案 4 :(得分:2)

我宁愿创建表示该对象的类,并将其转换为JSON。我认为你在其他地方有JSON接口,并且很多关于如何从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;
}

然后使用您喜欢的任何lib /框架将填充的ToJson对象转换为JSON。

答案 5 :(得分:0)

有很多图书馆可以帮到你。

如果您遇到这些库的更具体问题,您应该发布它们。