【问题标题】:Searching JSONObject in springboot rest api (postgresql)在spring boot rest api(postgresql)中搜索JSON对象
【发布时间】:2020-10-11 19:18:31
【问题描述】:

我想根据存储在数据库中的一些 JSON 数据执行搜索操作,格式如下:

   {   
     "id": "ae002e48-f540-44ac-9050-3bd24902a",
     "type": "Devil",
     "System": "not your system",
     "dateCreated": "2012-12-12T15:22:53.798",
     "meta":{
             "key":123,
             "life": "get a life",
             "animal":"not dirty"
            },
     "item": null
 }

那么,如何在 postgresql 数据库中的所有 JSON 中搜索所有动物都“不脏”的关键 metadata.animal?

PS:我想在获取请求期间执行搜索(例如 get 请求到 /animal/search/meta/animal?animal=not+dirty 应该搜索所有记录并显示meta.animal=notdirty 的所有记录)。

【问题讨论】:

  • 您是否尝试过在数据库查询中使用正则表达式?另外,请说明您使用的数据库以及您要搜索的所有数据是否都采用给定格式。
  • 使用的数据库:PostgreSQL、id、type、system、meta、item...等是列的名称。元列以 JSON 格式存储数据。我想搜索 meta 列,例如 meta.life=get a life(使用 get 请求)的记录
  • 是的,这可以使用正则表达式来完成。研究此链接以获取更多详细信息:postgresqltutorial.com/postgresql-regexp_matches

标签: java json postgresql spring-boot rest


【解决方案1】:

PostgreSQL 从 9.2 版开始支持原生 JSON 数据类型,因此我假设您的数据库表列的类型为“json”。如果是这种情况,一种方法是引导您的 http get 请求执行 SQL 查询,如下所示:

SELECT
    your_column_name ->> 'id' AS id
FROM
    your_table_name
WHERE
    your_column_name -> 'meta' ->> 'animal' = 'not dirty'

您可能需要检查thisthis

【讨论】:

    【解决方案2】:

    我假设这个 JSON 存储在特定的 1 列中。

    1. 在 java 中创建一个类似的 VO bean 文件。

       public class DatabaseJson{
               private Object item;
               private String dateCreated;
               private Meta meta;
               private String id;
               private String type;
               private String system;
           // generate getters settrers as well
           }
      

    你的 Meta 类会是这样的,

    public class Meta{
            private String animal;
            private int key;
            private String life;
        // generate getters settrers as well
        }
    
    1. 在你的代码中获取这个 json 数据,数据类型可能是字符串。

      列表

    // 现在您可以将其转换为您的 vo 对象(使用 fasterxml)

    DatabaseJson databseJson = convertStringtoElement(inputString, DatabaseJson.class);

    现在您可以从 databaseJson 中检查特定值,(在您的情况下,它是动物)

    public static <T> T convertStringtoElement(String jsonString, Class<T> conversionClass)
        {
            T eee = null;
            try {
                com.fasterxml.jackson.databind.ObjectMapper objectMapper = new com.fasterxml.jackson.databind.ObjectMapper();
                objectMapper.addMixIn(JAXBElement.class, JAXBElementMixIn.class);
                if(StringUtils.isNotEmpty(jsonString)){
                    com.fasterxml.jackson.databind.JsonNode jsonNode = objectMapper.readTree(jsonString);
                    eee = objectMapper.treeToValue(jsonNode, conversionClass);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return eee;
        }
    

    【讨论】:

    • 感谢您的回答!我想在获取请求期间执行搜索(例如对 /animal/search/meta/animal?animal=not+dirty 的获取请求应该搜索所有记录并显示所有带有 meta.animal=notdirty 的记录)。你的方法在那种情况下会有帮助吗?
    • 嗨@Jaykumar,对stackoverflow.com/questions/62921359/…有什么建议吗?
    猜你喜欢
    • 2015-05-31
    • 1970-01-01
    • 2021-02-07
    • 2017-10-30
    • 1970-01-01
    • 2019-10-09
    • 2017-06-27
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多