PL / JSON消息列表

时间:2016-02-10 13:36:14

标签: json oracle11g pljson

我正在解析存储在oracle 11g中的表CLOB中的json字符串。这个过程是一个长解析例程的一部分,它解析数据并将值存储在另一个表中,我只是注意到我的部分数据没有出来。 json使用JSONLint进行解析和验证。所以我已经简化了解析,试图找出我出错的地方。

所以我的桌子上的json看起来像这样。

{
    "JSON_data": {
        "plant_id": "3006",
        "transmit_time": "2015-12-18 11:57:45",
        "messages": [{
            "work_msg": {
                "msg_time": "2015-06-23 04:54:17",
                "trigger_type": "interval",
                "vert_correction": 358.3,
                "ch_latitude": 37.916302,
                "ch_longitude": -87.487365,
                "ch_heading": 212.3,
                "ch_cable_port": 1029.79,
                "ch_cable_stbd": 348.63,
                "ch_depth": -27.03,
                "slurry_velocity": 25.71,
                "slurry_density": 1.02,
                "ch_rpm": 205.49,
                "ch_psi": 540.89,
                "prod_instantaneous": 0,
                "prod_cumulative": 1216.100000,
                "outfall_latitude": 37.915967,
                "outfall_longitude": -87.484369,
                "outfall_heading": 120.7,
                "pump_entries": [{
                    "pump_name": "main",
                    "vacuum": 12.73,
                    "outlet_psi": 22.88
                }],
                "spud_entries": [{
                    "position": 6
                }]
            },
            "pipe_length_event": {
                "msg_time": "2015-06-23 04:54:17",
                "length_floating": 970
            }
        }]
    }
}

我的解析是正确地找到并使用' work_msg'数据。它是' pipe_length_event'我没有达到的数据。下面是我简化的pl / sql程序。

DECLARE

vCONTENT            CLOB;
v_parent_json           json;
v_json_message_list         json_list;
v_json_message_list_value   json_value;
v_parent_json_value         json_value;


BEGIN

SELECT CONTENT INTO vCONTENT FROM SJM_TEMP4;

v_parent_json := json(vCONTENT);
v_parent_json := json(v_parent_json.get(1));

v_json_message_list := json_list(v_parent_json.get('messages'));

DBMS_OUTPUT.PUT_LINE(v_json_message_list.count);

for message_loop_counter in 1 ..v_json_message_list.count loop
    v_parent_json_value := json(v_json_message_list.get(message_loop_counter)).get(1);

    DBMS_OUTPUT.PUT_LINE(v_parent_json_value.mapname);
END LOOP;

END;

我的dbms_output首先给我一个子列表计数1.不是2因此我的解析甚至没有识别" pipe_length_event"作为"消息的子列表"。

我如何获得" pipe_length_event"数据使用这个程序?我几乎可以肯定这是在过去工作所以我的第一个想法是json的格式不同。 json格式不好吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

发现它!!

问题实际上是JSON格式。以下是正确的格式。 “work_msg”列表未关闭,因此无法识别“pipe_length_event”列表。

{
    "JSON_data": {
        "plant_id": "3006",
        "transmit_time": "2015-12-18 11:57:45",
        "messages": [{
            "work_msg": {
                "msg_time": "2015-06-23 04:54:17",
                "trigger_type": "interval",
                "vert_correction": 358.3,
                "ch_latitude": 37.916302,
                "ch_longitude": -87.487365,
                "ch_heading": 212.3,
                "ch_cable_port": 1029.79,
                "ch_cable_stbd": 348.63,
                "ch_depth": -27.03,
                "slurry_velocity": 25.71,
                "slurry_density": 1.02,
                "ch_rpm": 205.49,
                "ch_psi": 540.89,
                "prod_instantaneous": 0,
                "prod_cumulative": 1216.100000,
                "outfall_latitude": 37.915967,
                "outfall_longitude": -87.484369,
                "outfall_heading": 120.7,
                "pump_entries": [{
                    "pump_name": "main",
                    "vacuum": 12.73,
                    "outlet_psi": 22.88
                }],
                "spud_entries": [{
                    "position": 6
                }]
            }
        }, {
            "pipe_length_event": {
                "msg_time": "2015-06-23 04:54:17",
                "length_floating": 970
            }
        }]
    }
}