rpy2: вывод json .dumps () действительно не соответствует объекту json - PullRequest
0 голосов
/ 08 мая 2020

в моем внутреннем коде, я вызвал функцию R из python с помощью rpy2, и у меня есть вывод словаря из моей функции R, и мне нужно отобразить его как JSON на конечной точке моего сервера. Но вывод json.dumps() для моего словаря на самом деле не является объектом JSON. Я понял, потому что вывод функции R как StrVector, мне нужно преобразовать выходные данные в словарь, а затем использовать json.dumps, но все еще не смог получить правильное форматирование JSON.

почему json.dumps вел себя попал на данные в словаре? как правильно получить JSON структурированные данные в конечной точке? любая мысль?

входные данные в словаре :

вот данные из словаря, возвращенные функцией R. тип этого словаря <class 'rpy2.robjects.vectors.StrVector'>

mydict = {"score":[72.188,62.0955,19.3374],"category":"medium",
"guidance":"text description","readiness":true,
"features_used":{"name":"gcstotal","value":null,
"range_value":[3.6667,5,6.3333,7.6667,9,10.3333,11.6667,13,14.3333],
"range_frequency":[0.0024,0,0.0049,0.0016,0.0073,0.0195,0.0098,0.0138,0.9406],"importance":0}}

обновление :

Я только что сделал проверку качества для mydict, это <class 'rpy2.robjects.vectors.StrVector'>, поэтому я попробовал ниже в моем коде:

json.dumps(str(mydict))

, тогда я оказался ниже вывода. Я вызвал функцию R из python и использовал rpy2 для этого, но результат json.dumps() для StrVector на самом деле не json. Зачем? есть идеи?

когда я загружаю этот словарь в json.dumps(mydict ), у меня получается такой результат:

"{\"score\":[72.188,62.0955,19.3374],\"category\":\"medium\",
\"guidance\":\"text description\",\"readiness_flag\":true,
\"features_used\":{\"name\":\"gcstotal\",\"value\":null,
\"range_value\":[3.6667,5,6.3333,7.6667,9,10.3333,11.6667,13,14.3333],
\"range_frequency\":[0.0024,0,0.0049,0.0016,0.0073,0.0195,0.0098,0.0138,0.9406],\"importance\":0}} \n"

Я просто не понимаю, почему в итоге получается не- JSON объект из json.dumps. Это проблема json.dumps или я неправильно использовал словарь jsonify на конечной точке сервера? почему у меня выше вывод? любая идея? спасибо

обновление 2: :

после того, как я попробовал решение @Victor S, оно сработало для вставленного словаря, но я не уверен, что могу украсить объект mydict следующим образом следуйте:

def post(self):
        if not request.get_json():
            return bad_request('No input data provided')
        raw_dict = request.json
        input_json = json.dumps(raw_dict)
        mydict = my_R_func(input_json)
        mydict = """mydict"""  ## inspired from @Victor S
        res = json.loads(str(mydict))
        res = json.dumps(res)
        return jsonify(res)

могу ли я украсить mydict = my_R_fun c (input_ json); mydict = "" "mydict" ""? Есть какой-либо способ сделать это?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Когда вы вызываете json .dumps () , вам необходимо передать ему действительный Python dict. Например, ваша "готовность": true true здесь вызовет ошибку, поскольку это недопустимая Python логическая переменная, а скорее синтаксис JSON.

Попробуйте следующее, чтобы обойти эту проблему.

import json

mydict = """{"score":[72.188,62.0955,19.3374],"category":"medium",
"guidance":"text description","readiness":true,
"features_used":{"name":"gcstotal","value":null,
"range_value":[3.6667,5,6.3333,7.6667,9,10.3333,11.6667,13,14.3333],
"range_frequency":[0.0024,0,0.0049,0.0016,0.0073,0.0195,0.0098,0.0138,0.9406],"importance":0}}"""

# convert to string
mydict_str = json.loads(mydict)

# to json obj.
tojson = json.dumps(mydict_str , indent=4)
print(tojson)
1 голос
/ 08 мая 2020

Попробуйте

dict(zip(mydict.names, map(list, list(mydict))))

Кредит @CT Zhu за этот ответ

по-видимому, это не будет обрабатывать вложенные списки, поэтому в качестве альтернативы вы можете использовать rpy2 (pip установить rpy2):

from rpy2.robjects import pandas2ri
pandas2ri.activate()

pandas2ri.ri2py(mydict)
Out[294]:
{"score":[72.188,62.0955,19.3374],"category":"medium",
"guidance":"text description","readiness":true,
"features_used":{"name":"gcstotal","value":null,
"range_value":[3.6667,5,6.3333,7.6667,9,10.3333,11.6667,13,14.3333],
"range_frequency":[0.0024,0,0.0049,0.0016,0.0073,0.0195,0.0098,0.0138,0.9406],"importance":0}}

rpy2 документация

...