Forum Stats

  • 3,853,598 Users
  • 2,264,243 Discussions
  • 7,905,405 Comments

Discussions

Is there a way to parse unknown depth level of nested json?

ronald_2017
ronald_2017 Member Posts: 617 Blue Ribbon

Hello All,


I use Oracle 19c, I am just wondering that is there any way to parse unknown depth level of nested json? Let's say that we don't know the height tree of response json. I use JSON_TABLE function. For example, if it could be used loop inside JSON_TABLE function, it would probably solved this issue.


Thanks

Best Answer

  • Paulzip
    Paulzip Member Posts: 8,753 Blue Diamond
    edited Mar 24, 2022 1:09AM Answer ✓

    Yes, using recursive subquery factoring

    with
      data(ajson) as (
        select
    '[
        {
        "id" : 1,
        "name" : "Joe",
        "children" :
        [
          {
            "id" : 2,
            "name" : "Steve",
            "children" :
            [
              {
                "id" : 4,
                "name" : "Jeff"
              }
            ]
          },
          {
            "id" : 3,
            "name" : "Mandy",
            "children" :
            [
              {
                "id" : 5,
                "name" : "Paul",
                "children" :
                [
                  {
                    "id" : 6,
                    "name" : "Sue"
                  },
                  {
                    "id" : 7,
                    "name" : "Marc"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]'  from dual
      )
    , treewalk(id, name, children, parent_id) as (
        select id, name, children, cast(null as number)
        from data d
           , json_table (
               d.ajson
             , '$[*]'
               columns (
                 id       number       path '$.id'
              ,  name     varchar2(20) path '$.name'
              ,  children varchar2 format json path '$.children'
               )
             ) j
        union all
        select j.id, j.name, j.children, d.id
        from treewalk d
           , json_table (
               d.children
             , '$[*]'
               columns (
                 id       number       path '$.id'
              ,  name     varchar2(20) path '$.name'
              ,  children varchar2 format json path '$.children'
               )
             ) j
      )
    cycle id set cycle to 1 default 0
    select id, name, parent_id
    from treewalk;
    
            ID NAME                  PARENT_ID
    ---------- -------------------- ----------
             1 Joe                            
             2 Steve                         1
             3 Mandy                         1
             4 Jeff                          2
             5 Paul                          3
             6 Sue                           5
             7 Marc                          5
    

Answers

  • Paulzip
    Paulzip Member Posts: 8,753 Blue Diamond
    edited Mar 24, 2022 1:09AM Answer ✓

    Yes, using recursive subquery factoring

    with
      data(ajson) as (
        select
    '[
        {
        "id" : 1,
        "name" : "Joe",
        "children" :
        [
          {
            "id" : 2,
            "name" : "Steve",
            "children" :
            [
              {
                "id" : 4,
                "name" : "Jeff"
              }
            ]
          },
          {
            "id" : 3,
            "name" : "Mandy",
            "children" :
            [
              {
                "id" : 5,
                "name" : "Paul",
                "children" :
                [
                  {
                    "id" : 6,
                    "name" : "Sue"
                  },
                  {
                    "id" : 7,
                    "name" : "Marc"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]'  from dual
      )
    , treewalk(id, name, children, parent_id) as (
        select id, name, children, cast(null as number)
        from data d
           , json_table (
               d.ajson
             , '$[*]'
               columns (
                 id       number       path '$.id'
              ,  name     varchar2(20) path '$.name'
              ,  children varchar2 format json path '$.children'
               )
             ) j
        union all
        select j.id, j.name, j.children, d.id
        from treewalk d
           , json_table (
               d.children
             , '$[*]'
               columns (
                 id       number       path '$.id'
              ,  name     varchar2(20) path '$.name'
              ,  children varchar2 format json path '$.children'
               )
             ) j
      )
    cycle id set cycle to 1 default 0
    select id, name, parent_id
    from treewalk;
    
            ID NAME                  PARENT_ID
    ---------- -------------------- ----------
             1 Joe                            
             2 Steve                         1
             3 Mandy                         1
             4 Jeff                          2
             5 Paul                          3
             6 Sue                           5
             7 Marc                          5
    
  • ronald_2017
    ronald_2017 Member Posts: 617 Blue Ribbon