Skip to content

Commit 70d66e9

Browse files
authored
Merge pull request #423 from puja-trivedi/fix_yamlutils_as_json_object_inject_type
added new variable: element_type in yamlutils.as_json_object() and JSONDumper.dumps()
2 parents bbf4f8b + 2a2bd40 commit 70d66e9

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

linkml_runtime/dumpers/json_dumper.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,14 @@ def default(o):
6262
else:
6363
return json.JSONDecoder().decode(o)
6464

65+
element_type = element.__class__.__name__
6566
if isinstance(element, BaseModel):
6667
element = element.model_dump()
6768
return json.dumps(
68-
as_json_object(element, contexts, inject_type=inject_type), default=default, ensure_ascii=False, indent=" "
69+
as_json_object(element, contexts, inject_type=inject_type, element_type=element_type),
70+
default=default,
71+
ensure_ascii=False,
72+
indent=" ",
6973
)
7074

7175
@staticmethod

linkml_runtime/utils/yamlutils.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,17 +360,22 @@ def as_yaml(element: YAMLRoot) -> str:
360360
return yaml.dump(element, Dumper=yaml.SafeDumper, sort_keys=False)
361361

362362

363-
def as_json_object(element: YAMLRoot, contexts: CONTEXTS_PARAM_TYPE = None, inject_type=True) -> JsonObj:
363+
def as_json_object(
364+
element: YAMLRoot, contexts: CONTEXTS_PARAM_TYPE = None, inject_type=True, element_type=None
365+
) -> JsonObj:
364366
"""
365367
Return the representation of element as a JsonObj object
366368
:param element: element to return
367369
:param contexts: context(s) to include in the output
368370
:param inject_type: if True (default), add a @type at the top level
371+
:param element_type: if provided, use this as the @type value instead of the element's class name
369372
:return: JsonObj representation of element
370373
"""
371374
rval = copy(element)
372375
if inject_type:
373-
rval["@type"] = element.__class__.__name__
376+
if element_type is None:
377+
element_type = element.__class__.__name__
378+
rval["@type"] = element_type
374379
context_element = merge_contexts(contexts)
375380
if context_element:
376381
rval["@context"] = context_element["@context"]

tests/test_loaders_dumpers/test_dumpers_pydantic.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ def test_json_dumper(self):
5454
"creator" not in data["books"][i].keys()
5555
self.assertEqual(data, remove_empty_items(self.bookseries.model_dump()))
5656

57+
# test @type is added to the top level and is assigned correct type when inject_type is True
58+
bookseries_with_type = json.loads(json_dumper.dumps(self.bookseries, inject_type=True))
59+
self.assertIn("@type", bookseries_with_type)
60+
self.assertEqual("BookSeries", bookseries_with_type.get("@type"))
61+
62+
# test @type is not added to the top level when inject_type is False
63+
bookseries_without_type = json.loads(json_dumper.dumps(self.bookseries, inject_type=False))
64+
self.assertNotIn("@type", bookseries_without_type)
65+
self.assertEqual(None, bookseries_without_type.get("@type"))
66+
5767

5868
class PydanticDumpersDateTestCase(LoaderDumperTestCase):
5969
@classmethod

0 commit comments

Comments
 (0)