首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用python代码解码Java int数组--为我的情况找到了解决办法

用python代码解码Java int数组--为我的情况找到了解决办法
EN

Stack Overflow用户
提问于 2015-01-06 09:42:24
回答 2查看 190关注 0票数 1

我从卡桑德拉的jmx那里得到了一些数据。其中一个元素的定义如下。https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java#L358

Java中返回的类型是int[];

代码语言:javascript
复制
import xml.etree.ElementTree as xml
text = requests.get('http://:8081/mbean?objectname=org.apache.cassandra.db:type=xxx,keyspace=x,columnfamily=x&template=identity').text
x = xml.fromstring(text)
>>> for i in x:
...     if i.get('name') == 'SSTableCountPerLevel':
...             p=i

>>> p.items()
[('description', 'Attribute exposed for management'), ('aggregation', 'array'), ('value', '[I@48a6ea00'), ('isnull', 'false'), ('strinit', 'false'), ('type', '[I'), ('availability', 'RO'), ('name', 'SSTableCountPerLevel')]
>>> p.get('value')
'[I@48a6ea00'

那么,如何将这个[I@48a6ea00 ]转换为python中的int列表呢?

@更新1:

似乎JPY正是为此目的而来的,但由于缺乏文件,我将尝试这一点,并在不久的将来提供一个更新。

https://github.com/bcdev/jpy

代码语言:javascript
复制
>>> import jpyutil
>>> jpyutil.init_jvm(jvm_maxmem='512M')
>>> import jpy
>>> b = jpy.array('int', [1,2,3])
>>> b.toString()
'[I@3f2a09d5'
>>> b
[I(objectRef=0x7fa66340dfe8)
>>> b[0]
1L
>>> b[2]
3L
>>> dir(b)
['__class__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__jinit__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'equals', 'getClass', 'hashCode', 'notify', 'notifyAll', 'toString', 'wait']

但是我仍然不能将字符串转换为Python列表,这就是我想要的。

@结论:

如果python知道Java数组的内容,那么应该可以在python代码中解码java int数组,但在上述情况下,[i@48a6e00不是java int数组的内容,而是对java int数组的内存引用,因此这是不可能的。

我通过MX4J获得了这个字符串,我将检查MX4J文档以查看MX4j处理数组的方式。

@更新2:

在检查了MX4J冲洗之后,它被明确地声明为

代码语言:javascript
复制
Obviously it has some limitations, like not being able to manipulate data which cannot be obtained from Strings

最后,我使用了JYTHON,很好地解决了我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-06 10:20:55

该值似乎在某个地方不正确地转换为对数组( int[] )的引用。你能打印原稿吗?即文本和xml,即x检查哪一步出错。

所以问题是原始响应只返回数组的内部描述符,‘[i@48a6e00’是int数组的引用,它是类型@address格式,只有在特定JVM中才有意义,它没有携带实际值信息。也就是说,无法获得值,因为它已经在响应中丢失了。

票数 1
EN

Stack Overflow用户

发布于 2015-01-06 10:30:29

如果您将字符串 '[I@48a6ea00'作为响应,那么将这个int[]数据类型写入数据库的那个人做了一些错误的事情。因此,对于python或cassandra来说,拯救原始数据为时已晚。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27795894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档