从Java ArrayList http响应转换为javaobj Python对象/列表时出现问题

从Java ArrayList http响应转换为javaobj Python对象/列表时出现问题,java,python-3.x,arraylist,httpresponse,Java,Python 3.x,Arraylist,Httpresponse,我的python程序连接到一个web服务,该web服务返回一个Java ArrayList(属于名为ObjectListEntry的自定义类类型,它包含6个属性)。从返回的流中使用javaobj构建Python列表时遇到问题。我尝试了v1和v2,得到了不同的异常 Windows 10、Eclipse 2019-12、PyDev 7.5 Python 3.8.1 javaobj-py3,通过pip安装(0.4.0.1?) 我正在执行以下步骤(下面是代码和异常跟踪) 检索响应 检查状态代码 将res

我的python程序连接到一个web服务,该web服务返回一个Java ArrayList(属于名为ObjectListEntry的自定义类类型,它包含6个属性)。从返回的流中使用javaobj构建Python列表时遇到问题。我尝试了v1和v2,得到了不同的异常

Windows 10、Eclipse 2019-12、PyDev 7.5 Python 3.8.1 javaobj-py3,通过pip安装(0.4.0.1?)

我正在执行以下步骤(下面是代码和异常跟踪)

  • 检索响应
  • 检查状态代码
  • 将response.text字符串转换为bytestream(来自UTF-8,默认的Python字符串编码)
  • 打印bytearray(零件可识别为我想要的数据:-))
  • 将字节数组传递给javaobj.loads函数,该函数将引发异常
  • 我想知道程序是否因为接收到属于自定义类的数据而失败。我将如何提供这个类定义或它与javaobj的Python等价物?似乎有一个相当明显的步骤,我错过了,希望你的帮助。谢谢你的回复

    更新:我在发行版和GitHub页面上看到了关于添加自定义tansformer*的代码,并在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,它发送从服务器接收的实际字节数组,而不是responst.text(并将其重新转换为字节)

    现在我得到了我请求的结果对象的数量。空对象,但仍优于异常


    将发布一个关于自定义javaobj处理的单独问题。

    经过更多的调试,我意识到我应该使用response.content,它发送从服务器接收的实际字节数组,而不是responst.text(并将其重新转换为字节)

    现在我得到了我请求的结果对象的数量。空对象,但仍优于异常

    将发布一个关于自定义javaobj处理的单独问题