Python 数据库表不可JSON序列化
我正在Jupyter笔记本中为一个使用Ibm Watson的机器学习项目设置一些python代码,当我尝试从Postgresql数据库表添加数据时,我不断得到一个TypeError不是JSON可序列化的 以下是为清晰起见的完整输出:Python 数据库表不可JSON序列化,python,json,postgresql,jupyter-notebook,typeerror,Python,Json,Postgresql,Jupyter Notebook,Typeerror,我正在Jupyter笔记本中为一个使用Ibm Watson的机器学习项目设置一些python代码,当我尝试从Postgresql数据库表添加数据时,我不断得到一个TypeError不是JSON可序列化的 以下是为清晰起见的完整输出: TypeError: description 0 Lorem ipsum sjvh hcx bftiyf, hufcil, igfgvju... 1 Lorem ajjg
TypeError: description
0 Lorem ipsum sjvh hcx bftiyf, hufcil, igfgvju...
1 Lorem ajjgvc wiufcfboitf iujcvbnb hjnkjc ivjh...
2 Lorem aiv ibveikb jvk igvcib ok blnb v hb b h...
3 Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb...
4 Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb...
5 Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb...
6 Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb...
7 Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb...
8 Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb...
9 Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb...
10 Lorem sivbnogc hbiuygv bnjiuygv bmkjygv nmjhgv... is not JSON serializable
这是我的python代码,它部署了ML模型来分析这些数据,如您所见,这些数据是随机的句子,但在测试后将是产品描述:
from watson_developer_cloud import NaturalLanguageClassifierV1
import pandas as pd
import psycopg2
# Connecting to my database.
conn_string = 'host={} port={} dbname={} user={} password={}'.format('159.***.20.***', 5432, 'searchdb', 'lcq09', 'Mys3cr3tPass')
conn_cbedce9523454e8e9fd3fb55d4c1a52e = psycopg2.connect(conn_string)
data_df_1 = pd.read_sql('SELECT description from public."search_product"', con=conn_cbedce2drf563454e8e9fd3fb8776fgh2e)
# Connecting to the ML model.
natural_language_classifier = NaturalLanguageClassifierV1(
iam_apikey='TB97dFv8Dgug6rfi945F3***************'
)
# Apply the ML model to db datas
classes = natural_language_classifier.classify('9841d0z5a1-ncc-9076', data_df_1)
print(json.dumps(classes, indent=2)) # Pretty sure the error is happening here
我怎样才能解决这个问题
编辑1:
我尝试打印此方法:
print(data\u df\u 1.to\u json())
查看格式现在是否为json格式,这是我得到的输出:
{“description:{“0:“Lorem ipsum sjvh hcx bftiyf,hufcil,igfgvjuoigv gvj ifcil,ghn fgbcggtc yfctg h vgchbvju.”,“1:“Lorem ajgvc wiufcfboitf iujcvbnb hjkjc ivjh oikgjvn uhhhhhhhhhhhhhhhhgv m,khbgv mkjhhhhgv.”,“2:”“Lorem aiv ibveikb jvk igvcib ok blnb v hb b hb bn JB bhb bhn bn vf vbgfc vbgv nb nbh nj mjhbv mkjhbv nmjhgbv nmkn”,“3”:“Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb j dvx”,“4”:“Lorem jsvc smc cbd cbd cbd BCD BCVDJ OB VCB VCB j dvx”,“5”:“Lorem jsvc smc CIDBC cbd BCD VCB VCB BCB VCB BCB VCB dvx代码”>
但我现在在添加此方法时遇到了这个错误:classes=natural\u language\u classifier.classify('9841d0z5a1-ncc-9076',data\u df\u 1.to\u json())
打印(json.dumps(classes,indent=2))
到类中:
TypeError Traceback (most recent call last)
<ipython-input-16-e72fac39b809> in <module>()
1 classes = natural_language_classifier.classify('998520s521-nlc-1398', data_df_1.to_json())
----> 2 print(json.dumps(classes, indent=2))
/opt/conda/envs/DSX-Python35/lib/python3.5/json/__init__.py in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)
235 check_circular=check_circular, allow_nan=allow_nan, indent=indent,
236 separators=separators, default=default, sort_keys=sort_keys,
--> 237 **kw).encode(obj)
238
239
/opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py in encode(self, o)
198 chunks = self.iterencode(o, _one_shot=True)
199 if not isinstance(chunks, (list, tuple)):
--> 200 chunks = list(chunks)
201 return ''.join(chunks)
202
/opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py in _iterencode(o, _current_indent_level)
434 raise ValueError("Circular reference detected")
435 markers[markerid] = o
--> 436 o = _default(o)
437 yield from _iterencode(o, _current_indent_level)
438 if markers is not None:
/opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py in default(self, o)
177
178 """
--> 179 raise TypeError(repr(o) + " is not JSON serializable")
180
181 def encode(self, o):
TypeError: <watson_developer_cloud.watson_service.DetailedResponse object at 0x7f64ee350240> is not JSON serializable
TypeError回溯(最近一次调用)
在()
1类=自然语言分类器。分类('998520s521-nlc-1398',数据为1.to_json()
---->2个打印(json.dumps(类,缩进=2))
/opt/conda/envs/DSX-Python35/lib/python3.5/json/__init__.py转储(obj、skipkeys、sure_ascii、check_circular、allow_nan、cls、indent、separator、default、sort_key、**kw)
235检查循环=检查循环,允许循环=允许循环,缩进=缩进,
236分隔符=分隔符,默认值=默认值,排序键=排序键,
-->237**kw).编码(obj)
238
239
/encode中的opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py(self,o)
198 chunks=self.iterencode(o,\u one\u shot=True)
199如果不存在(块,(列表,元组)):
-->200块=列表(块)
201返回“”。加入(块)
202
/opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py in_iterencode(o,当前缩进级)
434提升值错误(“检测到循环参考”)
435标记[markerid]=o
-->436 o=_默认值(o)
437从_iterencode(o,_当前_缩进_级别)得到的收益率
438如果标记不是无:
/默认为opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py(self,o)
177
178 """
-->179 raise TypeError(repr(o)+“不可JSON序列化”)
180
181 def编码(自身,o):
TypeError:不可序列化JSON
-
正如您在代码中看到的,我想在数据库中的描述表中部署一个机器学习文本分类器
我可以用下面的代码对一个句子进行分类,但我想对整个数据库的描述表进行分类:
classes=natural\u language\u classifier.classify('998260x551-nlc-1018','今天有多热?'))
打印(json.dumps(classes.result,indent=2))
这就是为什么我用dataframedata\u df\u 1
替换了这个句子,您需要将表转换为特定的JSON格式,并使用classify\u collection()
方法,如中的示例所示
导入json
从ibm_watson导入自然语言分类器1
自然语言分类器=自然语言分类器v1(
iam_apikey='{apikey}',
url='{url}')
classes=自然语言分类器。分类集合('10D41B-nlc-1',[{'text':'今天有多热?},{'text':'外面热吗?}])。获取结果()
打印(json.dumps(类,缩进=2))
有一个df.to_json()
方法。谢谢你的回答,我应该把这个方法放在哪里?你能举个例子吗?我试着打印这个方法:print(data\u df\u 1.to\u json())
,结果是:@Iocq请回答你的问题,而不是在评论中发帖。你想用json做什么?谢谢你的回答@reportgunner!如何用数据库表中名为:data_df_1
?的描述数据替换文本值?尝试添加以下内容:[{'text':data_df_1.to_json()}],但出现以下错误:WatsonApiException:error:Not found,code:404,信息:{'description':'Classifier Not found',X-dp-watson-tran-id:gateway02-126492285,X-global-transaction-id:ffea405d5ce6876fb574bfd
您知道我的表名是否需要为“文本”而不是“说明”吗?