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

如何在java中创建复杂的json对象?,java,json,jackson,Java,Json,Jackson,我正在尝试用java创建这个json对象,并且: { "notification": { "message": "test", "sound": "sounds/alarmsound.wav", "target": { "apps": [ { "id": "app_id", "platforms": [

我正在尝试用java创建这个json对象,并且:

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

如果有人能在java中创建它,我们将不胜感激

这里有各种各样的库可以帮助您

  • 谷歌GSON-
  • 杰克逊-
  • Groovy的JsonSlurper-

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

如果您真的想创建JSON对象,Jackson有您想要的:

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
生成的
节点
是一个
ObjectNode
,它继承了
JsonNode
,这意味着您可以获得
JsonNode
的所有细节:

  • 合理的
    .toString()
    表示
  • 导航功能(
    .get()
    .path()
    ——GSON在这方面没有等效功能,尤其不是
    .path()
    ,因为它无法对缺少的节点建模)
  • MissingNode
    表示不存在的节点,
    NullNode
    表示JSON null,所有这些都继承了
    JsonNode
    (GSON对此没有等价物——所有
    JsonNode
    的导航方法也可以在这些节点上使用)
  • 当然还有
    .equals()
    /
    .hashCode()

    • 我宁愿创建表示该对象的类,并将其转换为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;
      }
      

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

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

      下面是我为解决这个问题所做的

      JsonNodeFactory nodeFactory=新的JsonNodeFactory()

      打印pushContent然后输出我需要创建的确切json对象

      希望这对其他人也有帮助


      Rich

      对于那些试图使用此线程答案的人,请注意

      JsonNodeFactory nodeFactory = new JsonNodeFactory();
      
      不再使用jackson数据绑定包。相反,你应该这样做

      final JsonNodeFactory nodeFactory = JsonNodeFactory.instance;
      

      看到这个答案:

      作为一个想要回到Java的人,我偶然发现了这个问题:我应该认为这不值得我花时间吗?(我还没有开始在Java中使用JSON,只是以后再考虑。)杰夫,谢谢你的回复。我已经调查过杰克逊,并试图实施它。但是,我通常不是java开发人员,无法理解过程。@sigmavirus24我没有使用crockford库。@pixelworlds您遇到了什么问题?“我无法理解这个过程”并不能帮助人们帮助你。@Srinivas谷歌搜索可以帮助你。只需搜索jackson vs json或任何您想要比较的内容。简短回答:使用jackson。GSON很好,但在导航方面,Jackson遥遥领先;JsonNode rootNode=mapper.createObjectNode();((ObjectNode)rootNode.put(“name”,“Tatu”);-但是,我还没有弄清楚如何嵌套其他对象和数组。这非常有用!我将尝试实现这一点,看看它是如何进行的!再次感谢您的时间和帮助!很高兴它有帮助!请注意,
      ObjectMapper
      实际上并不用于创建节点,它的主要用途实际上是序列化和反序列化。在内部,它使用了一个
      JsonNodeFactory
      。我通常是一个javascript/PHP开发人员,所以这个java项目让我非常沮丧!我真的很感激你的好意!是的,与JavaScript和PHP不同,Java没有用于映射的本机类型——但与这两种语言不同,它实际上可以用更强大的方式表示它们,并且可以提高类型安全性!一个不同的世界…你的解决方案非常有效!我为其他人发布了我的实现!再次感谢你!下一次最好添加一些解释,而不仅仅是dump code.IMHO当代码清晰、自解释且直观时,就不需要以解释的名义添加冗长的额外文本行。让ans简短明了。@Dexter代码不会对每个人都是自我直觉的。你是对的@Rishi,但在这个例子中,一个程序员问了一个与代码相关的问题。另一个编码员用一些代码回答。你看过上面的代码了吗?它非常简单和直观。因此,我不认为需要额外的解释。
      JsonNodeFactory nodeFactory = new JsonNodeFactory();
      
      final JsonNodeFactory nodeFactory = JsonNodeFactory.instance;