Найти - Пользователи
Полная версия: JSON Schema
Начало » Python для новичков » JSON Schema
1
a.zharkov
Здравствуйте!
Есть json-schema, есть json данные
все отлично валидирую с помощью jsonschema.

У каждого элемента схемы есть description. Возможно ли каким то образом(не знаю как правильно сказать) объединить json данные с определенными элементами схемы(в частности description)? Может не совсем верно выражаю мысль - необходимо что бы на выходе json-данные приобрели элемент description в соответствии со схемой.

На выходе:
[code json]
[
{"methodName":{"value" : "test1", "description": "Название метода"} },
{"methodName":{"value" : "test2", "description": "Название метода"} },
{"methodName":{"value" : "test3", "description": "Название метода"} },
]
[/code]

Входные данные:
СХЕМА
[code json]
{
"$schema": "http://json-schema.org/draft-04/schema#",

"type": "array",
"items": {
"type": "object",
"properties": {
"methodName": {"description": "Название метода", "type": "string"},
}
}
}
[/code]

ДАННЫЕ
[code json]
[
{"methodName":"test1" },
{"methodName":"test2" },
{"methodName":"test3" },
]
[/code]


Rodegast
> необходимо что бы на выходе json-данные приобрели элемент description в соответствии со схемой.

Конечно description можно вытащить из схемы… но только зачем? Схема нужна только для валидации данных, а description это обычный комментарий, 90% что данные не должны его содержать.
a.zharkov
Каким образом его можно вытащить?
Rodegast
 >>> import simplejson
>>> s = """{"$schema": "http://json-schema.org/draft-04/schema#",
... "type": "array",
... "items": {"type": "object",
... "properties": {"methodName": {"description": "name", "type": "string"}}}}"""
>>> s = simplejson.loads(s)
>>> s["items"]["properties"]["methodName"]["description"]
'name'
a.zharkov
Rodegast
Ну эт не совсем то чего хотелось бы…
сама схема огромна, данных еще больше. Схема и данные поставляются сторонней организацией. Каждый раз анализировать портянку на предмет изменений не сильно бы хотелось.
Для чего все это - постараться “объединить/модифицировать” данные со схемой, для рендеринга django. Ну что бы не методНэйм - а читаемое название значения.
Rodegast
Ну ладно… вот тебе рекурсивное решение
 import simplejson
s = """{"$schema": "http://json-schema.org/draft-04/schema#",
"type": "array","items": {"type": "object",
"properties": {"methodName": {"description": "name", "type": "string"}}},
"items2": {"type": "object","properties": {"methodName0": {"description": "name1", "type": "string"}}},
"items6": {"type": "object","properties": {"methodName3": {"description": "name6", "type": "object",
"items": {"type": "object","properties": {"methodName0": {"description": "name100", "type": "string"}}}}}}
}"""
 
def getDescription(json, attr):
	akum = []
	for k in ( k for k in json if isinstance(json[k], dict) ):
		if attr in json[k]:
			akum.append((k, json[k][attr]))
		akum += getDescription(json[k], attr)
	return akum
 
print getDescription(simplejson.loads(s), "description")
>>> [('methodName0', 'name1'), ('methodName', 'name'), ('methodName3', 'name6'), ('methodName0', 'name100')]
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB