TypeError: объект JSON должен быть str, а не «DetailResponse» - PullRequest
0 голосов
/ 23 мая 2019

Я настроил Jupyter Notebook, который соединяет мои Postgresql database, вызывает данные в таблице и применяет модель машинного обучения из API к этим данным, но я продолжаю получать TypeError: the JSON object must be str, not 'DetailedResponse'.

Моя записная книжка настроена на 3 ячейки, но для ясности я собрал их ниже:

from watson_developer_cloud import NaturalLanguageClassifierV1
import pandas as pd
import psycopg2
import json

conn_string = 'host={} port={}  dbname={}  user={}  password={}'.format('119.203.10.242', 5432, 'mydb', 'locq', 'Mypass***')
conn_cbedce9523454e8e9fd3fb55d4c1a52e = psycopg2.connect(conn_string)

data_df_1 = pd.read_sql('SELECT description from public."search_product"', con=conn_cbedce9523454e8e9fd3fb55d4c1a52e)


natural_language_classifier = NaturalLanguageClassifierV1(
    iam_apikey='F76ugy8hv1s3sr87buhb7564vb7************'
)


classes = natural_language_classifier.classify('7818d2s519-nlc-1311', data_df_1.to_json())

print(json.loads(classes, indent=2))

И вывод полной ошибки:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-b6b7d122a500> in <module>()
      2 
      3 classes = natural_language_classifier.classify('7818d2s519-nlc-1311', data_df_1.to_json())
----> 4 print(json.loads(classes, indent=2))

/opt/conda/envs/DSX-Python35/lib/python3.5/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    310     if not isinstance(s, str):
    311         raise TypeError('the JSON object must be str, not {!r}'.format(
--> 312                             s.__class__.__name__))
    313     if s.startswith(u'\ufeff'):
    314         raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",


TypeError: the JSON object must be str, not 'DetailedResponse'

Я пытался сделать так много всего, и теперь я полностью застрял и не могу найти способ исправить это, или я просто не понимаю код достаточно, чтобы исправить это.

Пожалуйста, помогите.

EDIT

API генерирует заголовок в выходных данных, поэтому при попытке сериализации возникает ошибка. Есть ли способ удалить заголовок?

* * Тысяча двадцать-одина выход:
TypeError: {'Content-Security-Policy': "default-src 'none'", 'Content-Type': 'application/json', 'Content-Encoding': 'gzip', 'Expires': '0', 'X-Backside-Transport': 'OK OK', 'X-DP-Transit-ID': 'gateway01-1254538093', 'Cache-Control': 'no-cache, no-store', 'Pragma': 'no-cache', 'Connection': 'keep-alive', 'x-global-transaction-id': '7ecac92c59876gfjbb6d', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'Strict-Transport-Security': 'max-age=31536000;', 'X-DP-Watson-Tran-ID': 'gateway01-125765453', 'X-EdgeConnect-MidMile-RTT': '19', 'X-EdgeConnect-Origin-MEX-Latency': '498', 'Content-Length': '868', 'Date': 'Thu, 23 May 2019 17:15:58 GMT', 'X-XSS-Protection': '1'} is not JSON serializable

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Я не знаком с этой библиотекой, но постараюсь решить вашу проблему.

from watson_developer_cloud import NaturalLanguageClassifierV1
import pandas as pd
import psycopg2
import json

conn_string = 'host={} port={}  dbname={}  user={}  password={}'.format('119.203.10.242', 5432, 'mydb', 'locq', 'Mypass***')
conn_cbedce9523454e8e9fd3fb55d4c1a52e = psycopg2.connect(conn_string)

data_df_1 = pd.read_sql('SELECT description from public."search_product"', con=conn_cbedce9523454e8e9fd3fb55d4c1a52e)


natural_language_classifier = NaturalLanguageClassifierV1(
    iam_apikey='F76ugy8hv1s3sr87buhb7564vb7************'
)


classes = natural_language_classifier.classify('7818d2s519-nlc-1311', data_df_1.to_json())

data_dict = classes._to_dict() # this will returns dict
data_dict.pop('headers', None) # remove headers key
print(data_dict) # This shows you dictionary in terminal
# if you want to serialize this and save on disk, you should make json serialization for example.
json_data = json.dumps(data_dict)
print(json_data) # this shows your string(json) in terminal

Попробуйте тоже так.

1 голос
/ 23 мая 2019

Я бы добавил комментарий, но у меня пока нет репутации

json.loads () принимает строку, и кажется, что ваша переменная классов не является строкой. Возможно, вам придется использовать str (классы), чтобы использовать его строковое представление

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...