Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 9, 2018 07:35:05

a.zharkov
Зарегистрирован: 2017-11-15
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

JSON Schema

Здравствуйте!
Есть 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]


Офлайн

#2 Фев. 9, 2018 10:06:57

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

JSON Schema

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

Конечно description можно вытащить из схемы… но только зачем? Схема нужна только для валидации данных, а description это обычный комментарий, 90% что данные не должны его содержать.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Фев. 9, 2018 10:31:45

a.zharkov
Зарегистрирован: 2017-11-15
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

JSON Schema

Каким образом его можно вытащить?

Офлайн

#4 Фев. 9, 2018 10:57:27

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

JSON Schema

 >>> 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'



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Фев. 12, 2018 08:13:09

a.zharkov
Зарегистрирован: 2017-11-15
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

JSON Schema

Rodegast
Ну эт не совсем то чего хотелось бы…
сама схема огромна, данных еще больше. Схема и данные поставляются сторонней организацией. Каждый раз анализировать портянку на предмет изменений не сильно бы хотелось.
Для чего все это - постараться “объединить/модифицировать” данные со схемой, для рендеринга django. Ну что бы не методНэйм - а читаемое название значения.

Офлайн

#6 Фев. 12, 2018 11:12:29

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

JSON Schema

Ну ладно… вот тебе рекурсивное решение

 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')]



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Фев. 12, 2018 14:58:23)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version