Я пытаюсь создать JSON из строки с выражением, но перед этим мне нужно заменить операнд.
Это входные данные от пользователя:
"Apple == 5 & (Plum == 7 | Pear == 8)"
Я должен заменить "=="to" eq "или" & "to" и "и т. д. (и более логическое выражение, если это необходимо)
"Apple eq 5 and (Plum eq 7 or Pear eq 8)"
И, наконец, это должен быть результат в JSON Если быть более точным это:
{
"CategoryId": 0,
"FilterRequest":
{
"Page": 1,
"PageSize": 10,
"Filter":
{
"Logic": "and",
"Filters": [
{
"Logic": "or",
"Filters": [
{
"Field": "Plum",
"Operator": "eq",
"Value": "7"
},
{
"Field": "Pear",
"Operator": "eq",
"Value": "8"
}
]
},
{
"Field": "Apple",
"Operator": "eq",
"Value": "5"
}
]
}
}
}
Не могли бы вы рассказать мне свои идеи, как это сделать?может быть, единственный способ ... спасибо
РЕДАКТИРОВАНИЕ: 14/5/2019
Я пытался найти как можно больше информации о моей проблеме, и я думаю, что 'м на полпути.Если я когда-либо выбрал правильный путь.Не могли бы вы дать мне отзыв или совет по поводу кода ниже?
string = "Apple == 5 & (Plum == 7 | Pear == 8)"
string = string.replace('==', ' eq ')
string = string.replace('<>', ' ne ')
string = string.replace('>' , ' gt ')
string = string.replace('>=', ' ge ')
string = string.replace('<' , ' lt ')
string = string.replace('<=', ' le ')
string = string.replace('&' , ' and ')
string = string.replace('|' , ' or ')
string = string.replace('!=', ' not ')
print(string)
# "Apple eq 5 and (Plum eq 7 or Pear eq 8)"
import pyparsing as pp
operator = pp.Regex(r">=|<=|!=|>|<|=|eq").setName("operator")
number = pp.Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?")
identifier = pp.Word(pp.alphas, pp.alphanums + "_")
and_ = CaselessLiteral("and").setResultsName("Logic")
or_ = CaselessLiteral("or").setResultsName("Logic")
not_ = CaselessLiteral("not").setResultsName("Logic")
logic = [
(and_, 2, (pp.opAssoc.LEFT),),
(or_, 2, pp.opAssoc.LEFT,),
(not_, 1, pp.opAssoc.RIGHT,),
]
comparison_term = (identifier | number)
condition = pp.Group(comparison_term("Field") + operator("Operator") + comparison_term("Value"))
expr = pp.operatorPrecedence(condition("Filters"), logic).setResultsName("Filter")
pars = expr.parseString(string).dump()
import json
with open("C:\\Users\\palo173\\Desktop\\example.json","w") as f:
json.dump(o,f)
Фактический результат, но, к сожалению, не окончательный.Мне нравится слышать ваши идеи, что делать дальше.
{
"Filter": {
"Filter": {
"Filters": [
{
"Field": "Apple",
"Operator": "eq",
"Value": "5"
},
{
"Filters": [
{
"Field": "Plum",
"Operator": "eq",
"Value": "7"
},
{
"Field": "Pear",
"Operator": "eq",
"Value": "8"
}
],
"Logic": "or"
}
],
"Logic": "and"
}
}
}