我的python程序连接到返回Java ArrayList(名为ObjectListEntry的自定义类类型,其中包含6个属性)的Web服务。我在从返回的流中使用javaobj构造Python列表时遇到麻烦。我已经尝试使用v1和v2并获得不同的异常。
Windows 10,Eclipse 2019-12,PyDev 7.5
的Python 3.8.1
通过pip(0.4.0.1?)安装的javaobj-py3
我正在执行以下步骤(下面的代码以及异常跟踪)
检索响应
检查状态码
将response.text字符串转换为字节流(来自默认的Python字符串编码UTF-8)
打印字节数组(部分可识别为我想要的数据:-))
将字节数组传递给javaobj.loads函数,该函数引发异常...
我想知道程序是否失败,因为它接收到属于自定义类的数据。我将如何提供此类定义或与javaobj等效的Python?似乎我缺少一个相当明显的步骤,希望您的帮助。感谢您的答复!
更新:我看到了有关在发行版以及GitHub页面* javaobj GitHub page上添加自定义tansformers的这段代码,并在v2加载调用中添加了我的自定义转换器...无效
# import javaobj
import javaobj.v2 as javaobj
# later, in a method
response = requests.post( f'https://{self.fedora_server}{self.fedora_path}getObjectList',
headers=headers, params=params)
print("Response status: ", response.status_code) # displays 200
data = bytearray( response.text, encoding='UTF-8')
print("data from server is: ", data) # displays partially recognizable byte string
pobj = javaobj.loads( data) # all hell breaks loose :-| --initial post
pobj = javaobj.loads( data, Cm4fObjListEntryTransformer()) # all hell breaks loose :-| --after update
print (pobj)
javaobj.v1的异常跟踪
Response status: 200
data from server is: bytearray(b'\xc2\xac\xc3\xad\x00\x05sr\x00%org.emile.cm4f.models.ObjectListEntry\xe2\x80\xa1\x04\xe2\x80\xba\xe2\x80\x9e6\xc2\xb6\xc2\xb8\x18\x02\x00\x06L\x00\x0ccontentModelt\x00\x12Ljava/lang/String;L\x00\x06handleq\x00~\x00\x01L\x00\nlastUpdateq\x00~\x00\x01L\x00\x05ownerq\x00~\x00\x01L\x00\x03pidq\x00~\x00\x01L\x00\x05titleq\x00~\x00\x01xpt\x00\x13http://cm4f.org/TEIt\x00\x0ehdl:11471/1001t\x00\x182020-02-17T14:39:55.933Zt\x00\x07padawant\x00\x0bo:emile.teit\x00\x0bTest Objectsq\x00~\x00\x00t\x00\x13http://cm4f.org/PDFt\x00\x0ehdl:11471/1006t\x00\x182019-10-02T09:19:54.101Zt\x00\x07padawant\x00\x0bo:emile.pdft\x00\x0bTest Objectsq\x00~\x00\x00t\x00\x18http://cm4f.org/Resourcet\x00\x0ehdl:11471/1008t\x00\x182019-10-02T09:19:54.261Zt\x00\x07padawant\x00\x10o:emile.resourcet\x00\x0bTest Objectsq\x00~\x00\x00t\x00\x15http://cm4f.org/Storyt\x00\x0ehdl:11471/1010t\x00\x182019-10-02T09:19:54.381Zt\x00\x07padawant\x00\ro:emile.storyt\x00\x0bTest Objectsq\x00~\x00\x00t\x00\x14http://cm4f.org/SKOSt\x00\x0ehdl:11471/1009t\x00\x182020-02-17T14:39:56.769Zt\x00\x07padawant\x00\x0co:emile.skost\x00\x0bTest Object')
Exception in Tkinter callback
Traceback (most recent call last):
File "path-redacted\__init__.py", line 1883, in __call__
return self.func(*args)
File "path-redacted\dlgfcrepoconnect.py", line 156, in _connect_btn_clicked
my_fed_con.stub_get_object_list(username, "filter(regex(str(?pid), '^o:'))", 5)
File "path-redacted\fedoraapi\fedoraconnection.py", line 65, in stub_get_object_list
pobj = javaobj.loads( data)
File "path-redacted\lib\site-packages\javaobj\v1\core.py", line 112, in loads
return load(
File "path-redacted\lib\site-packages\javaobj\v1\core.py", line 87, in load
marshaller = JavaObjectUnmarshaller(
File "path-redacted\lib\site-packages\javaobj\v1\unmarshaller.py", line 144, in __init__
self._readStreamHeader()
File "path-redacted\lib\site-packages\javaobj\v1\unmarshaller.py", line 197, in _readStreamHeader
raise IOError(
OSError: The stream is not java serialized object. Invalid stream header: C2ACC3AD
使用javaobj.v2
Response status: 200
data from server is: bytearray(b'\xc2\xac\xc3\xad\x00\x05sr\x00%org.emile.cm4f.models.ObjectListEntry\xe2\x80\xa1\x04\xe2\x80\xba\xe2\x80\x9e6\xc2\xb6\xc2\xb8\x18\x02\x00\x06L\x00\x0ccontentModelt\x00\x12Ljava/lang/String;L\x00\x06handleq\x00~\x00\x01L\x00\nlastUpdateq\x00~\x00\x01L\x00\x05ownerq\x00~\x00\x01L\x00\x03pidq\x00~\x00\x01L\x00\x05titleq\x00~\x00\x01xpt\x00\x13http://cm4f.org/TEIt\x00\x0ehdl:11471/1001t\x00\x182020-02-17T14:39:55.933Zt\x00\x07padawant\x00\x0bo:emile.teit\x00\x0bTest Objectsq\x00~\x00\x00t\x00\x13http://cm4f.org/PDFt\x00\x0ehdl:11471/1006t\x00\x182019-10-02T09:19:54.101Zt\x00\x07padawant\x00\x0bo:emile.pdft\x00\x0bTest Objectsq\x00~\x00\x00t\x00\x18http://cm4f.org/Resourcet\x00\x0ehdl:11471/1008t\x00\x182019-10-02T09:19:54.261Zt\x00\x07padawant\x00\x10o:emile.resourcet\x00\x0bTest Objectsq\x00~\x00\x00t\x00\x15http://cm4f.org/Storyt\x00\x0ehdl:11471/1010t\x00\x182019-10-02T09:19:54.381Zt\x00\x07padawant\x00\ro:emile.storyt\x00\x0bTest Objectsq\x00~\x00\x00t\x00\x14http://cm4f.org/SKOSt\x00\x0ehdl:11471/1009t\x00\x182020-02-17T14:39:56.769Zt\x00\x07padawant\x00\x0co:emile.skost\x00\x0bTest Object')
Exception in Tkinter callback
Traceback (most recent call last):
File "path-redacted\__init__.py", line 1883, in __call__
return self.func(*args)
File "path-redacted\src\gui\dlgfcrepoconnect.py", line 156, in _connect_btn_clicked
my_fed_con.stub_get_object_list(username, "filter(regex(str(?pid), '^o:'))", 5)
File "path-redacted\src\fedoraapi\fedoraconnection.py", line 65, in stub_get_object_list
pobj = javaobj.loads( data)
File "path-redacted\lib\site-packages\javaobj\v2\main.py", line 82, in loads
return load(BytesIO(data), *transformers, **kwargs)
File "path-redacted\lib\site-packages\javaobj\v2\main.py", line 57, in load
contents = parser.run()
File "path-redacted\lib\site-packages\javaobj\v2\core.py", line 128, in run
raise ValueError("Invalid file magic: 0x{0:x}".format(magic))
ValueError: Invalid file magic: 0xc2ac
最佳答案
经过更多的调试,我意识到我应该使用response.content,它发送从服务器接收到的实际字节数组,而不是发送response.text(并将其转换为字节)。
现在,我取回了请求的结果对象的数量。空对象,但仍然比异常好。
将发布有关自定义javaobj处理的单独问题。