【问题标题】:Ways of creating JSON Objects in Java在 Java 中创建 JSON 对象的方法
【发布时间】:2017-01-25 08:03:54
【问题描述】:

以下是我想在我的 iOS (Swift) 和 Android (Java) 应用程序中使用的 JSON 正文。

{
    "type" : "select",
    "args" : {
        "table"  : "todo",
        "columns": ["id", "title","completed"],
        "where"  : {"user_id": 1}
    }
}

在 Swift 中,将上述内容转换为字典非常简单:

let params: [String: Any] = [
  "type" : "select",
  "args" : [
    "table"     : "todo",
    "columns"   : ["id","title","completed"],
    "where"     : ["user_id" : 1]
  ]
]

在Java中,我是使用GSON来做上面的,但是我觉得我的解决方案很丑,太长了

public class SelectQuery {

    @SerializedName("type")
    String type = "select";

    @SerializedName("args")
    Args args;

    public SelectTodoQuery(=) {
        args = new Args();
        args.where = new Where();
        args.where.userId = 1;
    }

    class Args {

        @SerializedName("table")
        String table = "todo";

        @SerializedName("columns")
        String[] columns = {
                "id","title","completed"
        };

        @SerializedName("where")
        Where where;

    }

    class Where {
        @SerializedName("user_id")
        Integer userId;
    }

}

在 Java 中是否有更好的方法来执行此操作,以及如何在不使用 GSON 的情况下在 Java 中本地表示此 JSON?

更新

我并不是要一份可以帮助我完成上述工作的库列表,我已经知道它们并且显然正在使用它们。我也不需要知道他们的表现。 我要求更好的实现(如果存在),如果 Java 不提供这样的功能,那也可以是一个可接受的答案。 此外,还有一个在 Java 中本地执行相同操作的示例。

【问题讨论】:

  • 您可以使用内置的JSONObjectJSONArray 类,但是您还需要管理错误处理。使用像 gson 这样的序列化库更方便
  • 嗨,阿卡什,没错!在 Java 中没有其他更好的方法吗?

标签: java android json


【解决方案1】:

嗯,有几个库可用于序列化和反序列化与json 之间的对象。

GSON 是最简单的一种,您可以将您的POJO(计划旧java 对象)转换为JSON,而无需对其进行注释。

LoganSquare 是用于此目的的最佳库,它需要您对字段进行注释,但性能非常高。

Github 页面实际上讲述了 LoganSquare 与其他选项的基准研究。

还有一些其他的,例如 MoshiJackson,但考虑到平台的限制,我发现 LoganSquare 是最好的。

就 Native 能力而言,Java 到目前为止还没有提供 任何此类实用程序,如果有人对Third partylibs 不感兴趣,我上面提到的项目都是开源对象, 可以分叉它们并根据自己的实现自己的版本 用例。

【讨论】:

    【解决方案2】:

    使用 Gson 你可以尝试这样的事情,我不确定你想在这里阅读的类型:

    final GsonBuilder builder = new GsonBuilder();
    final Gson gson = builder.enableComplexMapKeySerialization().create();
    final Type type = new TypeToken<Map<String, Args>>(){}.getType();
    
    // deserialize from a string (read your file to string maybe)
    HashMap<String, Args> aMap = gson.fromJson(aJSONString, type);
    

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2015-05-22
      相关资源
      最近更新 更多