【问题标题】:How to Insert JSON data into database如何将 JSON 数据插入数据库
【发布时间】:2019-10-25 15:11:16
【问题描述】:

通过 ajax 从我的 UI 我得到一个 JSON 数据,我试图将其插入到我的数据库中,我不知道我该怎么做,我知道如何使用 prepared statements 在数据库中插入一些东西但是在 JSON 的情况下,我完全糊涂了

这是我在 doPost 中得到的 JSON

{"ImageData":[{"Counter":"Counter A","Name":"CountA1.jpg","IsActive":"Y"},{"Counter":"Counter A","Name":"CountA2.jpg","IsActive":"Y"}]}

servlet 代码 -->

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        Scanner scanner = new Scanner(request.getInputStream());
            String imageData = scanner.nextLine();
    System.out.println(imageData);

}

现在我想将其存储在我的数据库中,例如

我需要解析这个 JSON,我该怎么做ps.setInt(index, 0);,我不知道

编辑/更新

作为 @Anjana Senanayake 回答我正在这样做

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Scanner scanner = new Scanner(request.getInputStream());
        String imageData = scanner.nextLine();
        System.out.println(imageData);
        JSONObject jsonObj = new JSONObject(imageData);
        JSONArray jsonArray = jsonObj.getJSONArray("ImageData");

        JSONObject innerObj = new JSONObject(jsonArray); // this one is throwing error 
// eror is `The type of the expression must be an array type but it resolved to JSONArray`
        String counter = innerObj.getString("Counter");
        String name = innerObj.getString("Name");
        String isActive = innerObj.getString("IsActive");

        System.out.println(counter);

    }

但它在JSONObject innerObj = new JSONObject(jsonArray[0]); 处抛出错误,错误是The type of the expression must be an array type but it resolved to JSONArray

【问题讨论】:

  • 这是一个相当广泛的问题,但如果您不限于 servlet,我建议您查看 Spring Boot 并使用 Jackson 注释将 JSON 映射到 java 对象,并在该对象上使用 JPA 注释进行映射它到数据库。

标签: java json servlets


【解决方案1】:

这里有几个选项。这取决于您想要实现的目标:)

又快又脏

将其保存为字符串。您必须使用String 对象创建一个新类,然后将您的 JSON 数据放入该对象并保存。

我意识到它不会起作用,因为它不是你真正想要的:)

更好的方法

创建一个包含所有字段的新类。

// File: ImageData.java
public class ImageData {
    private String counter;
    private String name;
    private String isActiveJpg;

    // getters and setters
}

// File: Data.java
public class Data {
    private List<ImageData> imageDataList;

    // getters and setters
}

有了这些类,您就可以使用 JacksonGSON 库了。请查看 Jackson here 和 GSON serializationdeserialization 的使用示例。

旁注

我建议重新考虑设计本身。例如。字段的命名和实体的逻辑非常具有误导性(isActiveJpg 之类的东西。它应该是Set,它应该有一个更好的命名,比如isJpg 或类似的东西)。

【讨论】:

  • 抱歉,我已经更新了,现在只有isActive
  • 先生,根据您的第一个选项,我怎样才能实现这一点,因为我是 java 新手,不是很新,但是如果您为此提供一些代码帮助,那么它将非常有帮助,或者对于第二个选项也有一些更多代码将对我有所帮助,我必须使用 servelt 来保存数据,因为我在 servlet post 方法中获取所有 json
  • 好的,我重读了您的问题,您希望将完整的结构保存到数据库中。请使用更好的方法小节中的示例。第一个选项不是您想要和需要做的。
  • 先生,我在 servlet dopost 工作,我正在获取 json,现在必须创建一个类,我必须在其中设置 getter,并且计数器的 setter 处于活动状态并命名,然后呢?跨度>
  • 创建完这些类后,我建议看一下并阅读以下文章:-GSON deserialization guide-GSON serialization guide-Reading and writing JSON data
【解决方案2】:

使用 org.json 库解析并创建 JsonObject :-

JSONObject jsonObj = new JSONObject(imageData);
JSONArray jsonArray = jsonObj.getJSONArray("ImageData");

现在,使用这个对象来获取你的值:-

JSONObject innerObj = new JSONObject(jsonArray[0]);

String counter = innerObj.getString("Counter");
String name = innerObj.getString("Name");
String isActive = innerObj.getString("IsActive");

由于它是一个对象数组,因此您必须对 jsonObj 中的所有元素重复上述操作。

【讨论】:

  • 我将如何将上述 json 存储到我的 pojo 中?
  • 你不要手动保存。 ImageData.class 是使用 Gson 将 imageData 从 json 解析为 java 后的 java 对象的类型。您必须编写 @Yuri Kushch ans 中提到的 ImageData.java POJO。
  • 我是新手,无法理解我将如何解析它,我必须通过我的 doPost servlet 方法保存它我只在那里获取 JSON,之前我使用 requet.getParameter() 来获取值,但在这里我的 UI 没有表单元素,这就是面临问题的原因
  • 是的,这是主要问题,我没有所有元素都有表单元素,这就是为什么我一次得到一个完整的 JSON
  • @viveksingh 检查更新的 ans 以了解如何从输入元素中获取值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2015-07-25
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
相关资源
最近更新 更多