diff --git a/sdk/basyx/aas/adapter/json/json_serialization.py b/sdk/basyx/aas/adapter/json/json_serialization.py index 0817f2bac..155aced55 100644 --- a/sdk/basyx/aas/adapter/json/json_serialization.py +++ b/sdk/basyx/aas/adapter/json/json_serialization.py @@ -708,7 +708,7 @@ def _entity_to_json(cls, obj: model.Entity) -> Dict[str, object]: data["entityType"] = _generic.ENTITY_TYPES[obj.entity_type] if obj.global_asset_id is not None: data["globalAssetId"] = obj.global_asset_id - if obj.specific_asset_id is not None: + if obj.specific_asset_id: data["specificAssetIds"] = list(obj.specific_asset_id) return data diff --git a/sdk/test/adapter/json/test_json_serialization.py b/sdk/test/adapter/json/test_json_serialization.py index e53cf6041..1fb2748fd 100644 --- a/sdk/test/adapter/json/test_json_serialization.py +++ b/sdk/test/adapter/json/test_json_serialization.py @@ -68,6 +68,26 @@ def test_random_object_serialization(self) -> None: json.loads(json_data) + def test_entity_omits_empty_specific_asset_ids(self) -> None: + # An Entity without specific asset ids must leave specificAssetIds out + # entirely: the schema gives it minItems 1, so an empty array is invalid. + # AASd-014 forbids them on a co-managed entity, so this is every such entity. + entity = model.Entity("test_entity", model.EntityType.CO_MANAGED_ENTITY) + data = json.loads(json.dumps(entity, cls=AASToJsonEncoder)) + self.assertNotIn("specificAssetIds", data) + + def test_entity_serializes_specific_asset_ids(self) -> None: + # AASd-014: only a self-managed entity may carry specific asset ids + entity = model.Entity( + "test_entity", + model.EntityType.SELF_MANAGED_ENTITY, + specific_asset_id=[model.SpecificAssetId("test_name", "test_value")], + ) + data = json.loads(json.dumps(entity, cls=AASToJsonEncoder)) + self.assertEqual(1, len(data["specificAssetIds"])) + self.assertEqual("test_name", data["specificAssetIds"][0]["name"]) + + class JsonSerializationSchemaTest(unittest.TestCase): @classmethod def setUpClass(cls):