【问题标题】:Jython and JacksonJython 和杰克逊
【发布时间】:2015-03-12 16:31:23
【问题描述】:

首先,我是 Jython 的新手。我正在寻找一种将 python 代码集成到 Java 项目中的方法。因此,我正在调查 Jython。

我正在尝试将 json 字符串转换为 java 对象 - 在 python 中。

首先,我一直在努力让 Jython 甚至找到我的 java 类。由于缺乏更优雅的解决方案,我只需执行以下操作即可继续前进:

import sys
sys.path.append('/home/anton/workspaces/m/TradePerformance/lib/jackson-databind-2.5.1.jar')
sys.path.append('/home/anton/workspaces/m/TradePerformance/lib/jackson-core-2.5.0.jar')

无论如何...

我正在尝试以下方法:

url = 'myRestService...'
response = urllib2.urlopen(url).read()
print response
import sys

mapper =  ObjectMapper
trades = ArrayList<TradeOrder>()
#trades = mapper.readValue(response, ArrayList<TradeOrder>().__class__, "");
#trades = mapper.convertValue(ArrayList<TradeOrder>().__class__, response)
#trades= mapper.reader
trades = mapper.readValue(response, ArrayList<TradeOrder>().__class__)

但是,运行时出现以下错误:

Traceback (most recent call last):
  File "/home/anton/workspaces/m/TradePerformance/src/com/test/test.py", line 41, in <module>
    trades = mapper.readValue(response, ArrayList<TradeOrder>().__class__);
TypeError: readValue(): expected 3-5 args; got 2

我不确定为什么 Jython 说它需要 3-5 个参数。 根据http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/ObjectMapper.html 上的 JavaDocs 此方法有 3 个重载,并且都需要 2 个参数。

谁知道问题出在哪里?

【问题讨论】:

    标签: java python json jackson jython


    【解决方案1】:

    self 算作参数。因此,您实际上是在正在尝试传递三个参数。那不是你的问题。

    您应该将&lt;TradeOrder&gt; 类型参数从您的ArrayLists 中移除。这是不必要的,在 Jython 中实际上是错误的。

    【讨论】:

    • 嗨,大卫,谢谢。我删除了&lt;TradeOrder&gt;。当你说“self 算作一个论点。我没有在任何地方使用self 时,我没有理解你的意思。
    • 当您进行方法调用时,拥有该方法的对象(在点的左侧)本身作为参数传递给该方法。按照惯例,Python 将此引用称为方法拥有对象self。 Java 和 C++ 称之为this
    • 我明白了。谢谢大卫。
    • 值得注意的是在 Python 中使用 Java 泛型语法的以下令人惊讶的方面,无论是 CPython 还是 Jython:A&lt;B&gt;() 肯定是合法的,假设名称 AB 已定义。这与声明A &lt; B &gt; () 相同,Python 2 中丰富的比较保证了此比较中的所有元素都是可比较的;不幸的是,不能保证 A &lt; BTrueFalse 的类。 True &gt; ()True (您正在与一个空元组进行比较); False &gt; ()False。最后你很困惑! Python 3 修复:它引发了 TypeError: unorderable types: type() &lt; type()
    【解决方案2】:

    这可能不是您的主要问题,但作为 JSON 的一般最佳实践,根值应始终是 JSON 对象,而不是标量或数组。这避免了诸如 Java 类型擦除之类的许多问题。 这并不是说你不能让Lists 和这样的集合工作,而是说泛型类型需要格外小心——只要根值是一个对象,这些工作就没有必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2011-08-25
      • 2020-04-12
      • 1970-01-01
      相关资源
      最近更新 更多