| name | json-parser |
| description | Parse and validate JSON data from construction APIs, IoT sensors, and BIM exports. Transform nested JSON to flat DataFrames. |
| homepage | https://datadrivenconstruction.io |
| metadata | {"openclaw":{"emoji":"🏷️","os":["win32"],"homepage":"https://datadrivenconstruction.io","requires":{"bins":["python3"]}}} |
JSON Parser for Construction Data
Overview
Construction systems increasingly use JSON for data exchange - from IoT sensors to BIM metadata exports. This skill handles parsing, validation, and flattening of JSON structures.
Python Implementation
import json
import pandas as pd
from typing import Dict, Any, List, Optional, Union
from dataclasses import dataclass
from pathlib import Path
@dataclass
class JSONParseResult:
"""Result of JSON parsing operation."""
success:
data:
errors: []
record_count:
:
():
.errors: [] = []
() -> JSONParseResult:
:
(file_path, , encoding=) f:
data = json.load(f)
JSONParseResult(, data, [], ._count_records(data))
json.JSONDecodeError e:
JSONParseResult(, , [], )
Exception e:
JSONParseResult(, , [(e)], )
() -> JSONParseResult:
:
data = json.loads(json_string)
JSONParseResult(, data, [], ._count_records(data))
json.JSONDecodeError e:
JSONParseResult(, , [], )
() -> :
(data, ):
(data)
(data, ):
() -> [, ]:
flat = {}
key, value data.items():
new_key = prefix key
(value, ):
flat.update(.flatten_json(value, new_key))
(value, ):
((i, (, , , , ())) i value):
flat[new_key] = value
:
i, item (value):
(item, ):
flat.update(.flatten_json(item, ))
:
flat[] = item
:
flat[new_key] = value
flat
() -> pd.DataFrame:
(data, ):
flat_records = [.flatten_json(r) (r, ) {: r} r data]
pd.DataFrame(flat_records)
(data, ):
((v, ) v data.values()):
pd.DataFrame(data)
:
flat = .flatten_json(data)
pd.DataFrame([flat])
pd.DataFrame()
() -> []:
parts = path.split()
current = data
part parts:
(current, ) part current:
current = current[part]
(current, ) part.isdigit():
current = current[(part)]
:
[]
current (current, ) [current]
() -> [, ]:
flat = .flatten_json(data)
missing = [f f required_fields f flat]
present = [f f required_fields f flat]
{
: (missing) == ,
: missing,
: present,
: (present) / (required_fields) *
}
():
() -> pd.DataFrame:
elements = []
data:
elements = data[]
data:
elements = data[]
data:
elements = data[]
(data, ):
elements = data
elements:
pd.DataFrame()
flat_elements = []
elem elements:
(elem, ):
flat = .flatten_json(elem)
flat_elements.append(flat)
pd.DataFrame(flat_elements)
() -> [, ]:
props = {}
key [, , , ]:
key element (element[key], ):
props.update(element[key])
props
():
() -> [, ]:
{
: data.get() data.get(),
: data.get() data.get(),
: data.get() data.get(),
: data.get(, ),
: data.get(, )
}
() -> pd.DataFrame:
readings = [.parse_sensor_reading(r) r data]
pd.DataFrame(readings)