【问题标题】:Checking if JSON Key exists in REST method检查 REST 方法中是否存在 JSON 密钥
【发布时间】:2017-03-01 10:36:20
【问题描述】:

我正在实现一个 REST API,并想检查通过我的 POST 方法传递的 JSON 格式请求中是否存在密钥。

我正在寻找类似于jsonobject.haskey 类型的方法。到目前为止,我已经遇到过 Jackson 和 json-simple 库,但是关于它们的许多信息似乎已经过时,而且我很难导航。

我的目标是接受 JSON 格式的 POST 请求来创建资源实例。根据 JSON 对象中键的存在,将通过 setter 分配值。

如果您可以将我引导至库以及 API 和一些示例,那将非常有帮助。

{
    "id": 1,
    "name": "A green door",
    "price": 12.50,
    "tags": ["home", "green"]
}

将被处理为

{
    "id": 1,
    "name": "A green door",
    "price": 12.50,
    "option":,
    "tags": ["home", "green"]
}

因为JSON.hasOptionKey 失败。

【问题讨论】:

标签: java json rest post


【解决方案1】:

这样做的标准方法是在 JSON 请求负载和域对象之间建立某种契约,显然您可以使用一些简单的 JSON 解析库手动解析 json,但这很容易出错。

使用 GSON 之类的东西,您可以用 Java 对象表示您的 JSON 结构,反之亦然,例如:

class X {
    String id;
    List<String> values;
} 

将序列化为:

{"id": 3, "values": ["1", "2", "3"]}

然后您还可以设置(反)序列化的选项,以便解析器知道如何处理空值,例如,如果 java 对象中缺少 id,则 JSON 将为

{"values": ["1", "2", "3"]}

更新

这是一个使用 GSON 的示例(为简洁起见,删除了导入和 getter/setter):

public class Question42529415 {

    private static final Gson GSON = new GsonBuilder()
            .setPrettyPrinting()
            //.serializeNulls()
            .create();

    private static Item fromPost(String postRequestJson) {
        return GSON.fromJson(postRequestJson, Item.class);
    }

    private static String toClient(Item item) {
        return GSON.toJson(item);
    }

    public static void main(String[] args) {
        String clientReq = "{\n"
                + "    \"id\": 1,\n"
                + "    \"name\": \"A green door\",\n"
                + "    \"price\": 12.50,\n"
                + "    \"tags\": [\"home\", \"green\"]\n"
                + "}";

        Item item = fromPost(clientReq);
        System.out.println(item.getName() + " " + item.getOption());

        item.setOption("modified option");
        String modified = toClient(item);
        System.out.println(modified);
    }
}

class Item {
    private String id;
    private String name;
    private String option;
    private double price;
    private List<String> tags;

    // getters and setters
}

【讨论】:

  • 你能告诉我以下是否有意义吗? 1)设置 Post 方法以将 gson 作为参数,2)实现一个序列化程序类并在 POST 方法内调用它,3)在序列化程序类中,设置反序列化选项以处理空值,4)返回 JSON 对象转换为字符串,然后传递给我的服务以在我的模型中设置正确的值
  • @viviboox3,听起来不错 :) 查看我的更新示例
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
相关资源
最近更新 更多