2016-02-10 6 views
0

Я работаю над разбором строки json, хранящейся в таблице CLOB в oracle 11g. Этот процесс является частью длинной процедуры разбора, которая анализирует данные и сохраняет значения в другой таблице, и я только заметил, что часть моих данных не выходит. Json анализирует и проверяет с помощью JSONLint. Поэтому я упростил синтаксический анализ, чтобы попытаться выяснить, где я ошибаюсь.Списки сообщений PL/JSON

Так что мой 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 плохо отформатирован?

Заранее спасибо.

ответ

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 
      } 
     }] 
    } 
}