mirror of
https://github.com/lnbits/lnbits.git
synced 2025-06-28 09:40:59 +02:00
fix: safe json conversion (#3148)
This commit is contained in:
parent
ceb8203353
commit
f74fcea35b
17
lnbits/db.py
17
lnbits/db.py
@ -648,9 +648,9 @@ def model_to_dict(model: BaseModel) -> dict:
|
|||||||
def dict_to_submodel(model: type[TModel], value: dict | str) -> TModel | None:
|
def dict_to_submodel(model: type[TModel], value: dict | str) -> TModel | None:
|
||||||
"""convert a dictionary or JSON string to a Pydantic model"""
|
"""convert a dictionary or JSON string to a Pydantic model"""
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
if value == "null":
|
if value == "null" or value == "":
|
||||||
return None
|
return None
|
||||||
_subdict = json.loads(value)
|
_subdict = _safe_load_json(value)
|
||||||
elif isinstance(value, dict):
|
elif isinstance(value, dict):
|
||||||
_subdict = value
|
_subdict = value
|
||||||
|
|
||||||
@ -674,7 +674,7 @@ def dict_to_model(_row: dict, model: type[TModel]) -> TModel:
|
|||||||
type_ = model.__fields__[key].type_
|
type_ = model.__fields__[key].type_
|
||||||
outertype_ = model.__fields__[key].outer_type_
|
outertype_ = model.__fields__[key].outer_type_
|
||||||
if get_origin(outertype_) is list:
|
if get_origin(outertype_) is list:
|
||||||
_items = json.loads(value) if isinstance(value, str) else value
|
_items = _safe_load_json(value) if isinstance(value, str) else value
|
||||||
_dict[key] = [
|
_dict[key] = [
|
||||||
dict_to_submodel(type_, v) if issubclass(type_, BaseModel) else v
|
dict_to_submodel(type_, v) if issubclass(type_, BaseModel) else v
|
||||||
for v in _items
|
for v in _items
|
||||||
@ -695,7 +695,7 @@ def dict_to_model(_row: dict, model: type[TModel]) -> TModel:
|
|||||||
# TODO: remove this when all sub models are migrated to Pydantic
|
# TODO: remove this when all sub models are migrated to Pydantic
|
||||||
# NOTE: this is for type dict on BaseModel, (used in Payment class)
|
# NOTE: this is for type dict on BaseModel, (used in Payment class)
|
||||||
if type_ is dict and value:
|
if type_ is dict and value:
|
||||||
_dict[key] = json.loads(value)
|
_dict[key] = _safe_load_json(value)
|
||||||
continue
|
continue
|
||||||
_dict[key] = value
|
_dict[key] = value
|
||||||
continue
|
continue
|
||||||
@ -703,3 +703,12 @@ def dict_to_model(_row: dict, model: type[TModel]) -> TModel:
|
|||||||
if isinstance(_model, BaseModel):
|
if isinstance(_model, BaseModel):
|
||||||
_model.__init__(**_dict) # type: ignore
|
_model.__init__(**_dict) # type: ignore
|
||||||
return _model
|
return _model
|
||||||
|
|
||||||
|
|
||||||
|
def _safe_load_json(value: str) -> dict:
|
||||||
|
try:
|
||||||
|
return json.loads(value)
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
# DB is corrupted if it gets here
|
||||||
|
logger.error(f"Failed to decode JSON: '{value}'")
|
||||||
|
return {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user