[英]Converting java.lang.string to PYthon string/dictionary
我正在使用 SUTime 庫來完成與文本相關的任務。 這是使用的原始代碼:
import os
import json
from sutime import SUTime
import ast
import json
if __name__ == '__main__':
test_case = u'I need a desk for tomorrow from 2pm to 3pm'
jar_files = os.path.join(os.path.dirname('path to SUTime jar files'), 'jars')
sutime = SUTime(jars=jar_files, mark_time_ranges=True)
op=sutime.parse(test_case)
op1 = op
op2 = []
op2 = op1#json.loads(op1)#ast.literal_eval(op1)
#print(op2)
json_op = json.dumps(list2)
print(json_op)
注意:原始庫(sutime.parse)返回 json.loads(self._sutime.annotate(input_str)) 返回此錯誤:
TypeError: the JSON object must be str, bytes or bytearray, not 'java.lang.String'
所以,我修改它,使sutime.parse返回self._sutime.annotate(input_str),返回java.lang.string格式的output,如下:
[{"start":18,"end":26,"text":"tomorrow","type":"DATE","value":"2020-07-28"},{"start":27,"end":42,"text":"from 2pm to 3pm","type":"DURATION","value":{"end":"T15:00","begin":"T14:00"}}]
使用這個 output 進行分析/進一步處理是很棘手的,因為我一直在嘗試對它執行一些操作,比如轉換為 JSON,字符串分配導致錯誤,說它是 Z466DEEC76ECDFA6D38571 操作。無法執行。 有沒有辦法將其轉換為 Python 字符串或 Python 字典。 將其轉換為字典對於我的用例(或在上面提供的示例中的兩個字典)來說是理想的。 我已經嘗試 json.loads 嘗試將此 java.lang.string 轉換為字典列表,但失敗並顯示錯誤消息:
TypeError: the JSON object must be str, bytes or bytearray, not 'java.
我也嘗試過 ast.literal_eval() ,它返回一個錯誤說:
ValueError: malformed node or string: '[{"start":72,"end":80,"text":"December","type":"DATE","value":"2020-12"},{"start":111,"end":119,"text":"November","type":"DATE","value":"2020-11"}]'
所以,在最后的努力中,我試圖通過分配來去掉方括號:
op1[0] = ''
這導致錯誤說:
TypeError: 'java.lang.String' object does not support item assignment
由於 JPype 模塊中的更改,會出現此問題。
您可以修改調用 JVM 的sutime.py
的那部分,以提供為向后兼容而包含的附加參數:
jpype.getDefaultJVMPath(),
'-Djava.class.path={classpath}'.format(classpath=self._classpath),
convertStrings=True
或者,您可以通過將 JPype 模塊降級到早期版本(如 0.7.5 版)來重現早期行為 - 例如,通過
pip3 uninstall JPype1
pip3 install "JPype1==0.7.5"
我有確切的問題,我通過將 java.lang.String 轉換為 python 字符串然后將其轉換為 json 來解決它。
首先,將 sutime.py 的最后兩行修改為此
return json.loads(str(self._sutime.annotate(input_str, reference_date)))[0]
return json.loads(str(self._sutime.annotate(input_str)))[0]
然后在您的主要 class 中,將不帶 dumps() 的 sutime.parse 分配給一個變量
time = sutime.parse(test_case)
並執行以下檢查方法:
print(type(time))
print(time['value'])
第一次打印將返回 type'dict',第二次打印將返回“2020-06-10”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.