问题 将Java类结构转换为Python类


我们试图避免在一起使用Java和Python的项目中重复代码。大多数代码库都是用Java编写的,由于机器学习环境普遍存在,现在正在添加Python。

在绿地场景中,我们从某事开始。像swagger或protobuf,从生成的代码中派生出模型。但这现在不起作用。

J类带有一些注释注释,它们的目标是Java 8。

在研究时,我发现了以下可能的路径将类的结构(没有方法)转换为Python类结构:

  1. 从Java类生成XML模式
  2. 从xml架构文件生成Python类

额外的好处:这两种语言实际上是通过我们项目中的XML进行通信的,因此模式文件对其他用例很有帮助。我们正在使用maven来构建Java,因此将它包含在maven进程中会很不错。

我把它包含在pom.xml中:

<!-- https://mvnrepository.com/artifact/org.codehaus.mojo/jaxb2-maven-plugin -->
<dependency>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.3.1</version>
</dependency>

以及默认的插件配置

<plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>schemagen</id>
                    <goals>
                        <goal>schemagen</goal>
                    </goals>
                </execution>
            </executions>
            <!--
                Use default configuration, implying that sources are read
                from the directory src/main/java below the project basedir.

                (i.e. getProject().getCompileSourceRoots() in Maven-speak).
            -->
        </plugin>

但是我收到了一个错误

[ERROR] Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:2.3.1:schemagen (default-cli) on project common: JAXB errors arose while SchemaGen compiled sources to XML. -> [Help 1]       
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:2.3.1:schemagen (default-cli) on project common: JAXB errors arose while SchemaGen compiled sources to XML.  

然后我研究了JSON Schema作为中介,但是也没有真正削减它,因为从JSON模式创建Python类源代码并不容易。

那么有没有办法从Java代码生成简单的“Pojo”Python类?没有方法,没有复杂的交叉编译而是简单 结构 转换。我可以从IntelliJ中的Java文件生成UML图,所以所有信息都在那里,我只需要一个有助于转换的工具


4020
2018-04-03 12:56


起源

我已经使用python库generateDS从XSD生成模型文件并取得了一些成功。这是一个链接: davekuhlman.org/generateDS.html  你可以给它一个XSD,它为你吐出一个生成的模型。 - wholevinski
是的我知道那个图书馆。但是,如上所述,从Java生成XSD文件对我来说并不成功。 - pascalwhoop
好吧,我以为你还在走那条路,我的错。如果您不反对继续使用它,那么查看该JAXB错误的堆栈跟踪可能会有所帮助。 - wholevinski
看看这是否有助于您使用JSON模式方法? stackoverflow.com/questions/12465588/... - Tarun Lalwani
@TarunLalwani,不,因为它不生成类源代码。它只是在运行时运行。我想要类代码,以便PyCharm或vim等在开发期间支持IDE。 - pascalwhoop


答案:


那么有没有办法从Java代码生成简单的“Pojo”Python类?

我有一个去,下面是解决方案:

考虑到以下简单化 Pojo.java

public class Pojo {
    private String string = "default";
    public int integer = 1;
    public String getString(){
        return string;
    }
}

该解决方案需要3个阶段

1. Java Pojo到JSON Schema

我可以找到以下选项:

  1. FasterXML /杰克逊模块-jsonSchema: 这是基础,下面的库也在内部使用。
  2. mbknor / mbknor-杰克逊 - jsonSchema:上面正式引用以支持json架构的v4。
  3. REINERT / JJSchema

使用以下相关代码和选项 1(也通过网站):

ObjectMapper MAPPER = new ObjectMapper();
JsonSchemaGenerator generator = new JsonSchemaGenerator(MAPPER);
JsonSchema jsonSchema = generator.generateSchema(Pojo.class);
System.out.println(MAPPER.writeValueAsString(jsonSchema));

下面输出json模式字符串:

{"type":"object","id":"urn:jsonschema:Pojo","properties":{"string":{"type":"string"},"integer":{"type":"integer"}}}

2. JSON Schema后期处理

这个阶段是必需的,主要是因为我发现对于简单的用例(至少),Step 3 下面需要一个具有的json架构 definitions 财产强制。我想这是因为不断发展的架构定义@ http://json-schema.org/。此外,我们可以包括一个 title 用于指定下一步将生成的python类的名称的属性。

我们可以在Step的java程序中轻松完成这些 1 以上作为后续步骤。我们需要一个以下形式的json模式字符串:

{"definitions": {}, "title": "Pojo", "type":"object","id":"urn:jsonschema:Pojo","properties":{"string":{"type":"string"},"integer":{"type":"integer"}}}

请注意,只有添加 "definitions": {}, "title": "Pojo"

3. Json模式到Python类

frx08 / jsonschema2popo似乎很好地完成了这项工作。

pip install jsonschema2popo
jsonschema2popo -o /path/to/output_file.py /path/to/json_schema.json

还有一点

  1. Java-Json模式生成器将仅在输出中包含那些公共或具有公共getter的属性。
  2. 我假设对于大规模迁移来说,注释Java类将是一件痛苦的事。否则,如果这对您来说是可行的,则所有上述Java库都提供了丰富的注释,您可以在其中指定属性是否是必需的以及更多。

8
2018-04-11 14:22



我将研究它如何适用于更复杂的类型并报告回来。但答案看起来很有前途和直观 - pascalwhoop


TechWalla @https://www.techwalla.com/articles/how-to-convert-java-to-python  有详细的说明。看看它是否对你有所帮助。

在这里粘贴说明 步骤1 下载并解压缩java2python。您下载的文件是一个gzip文件,其中包含一个tarball文件;两者都是压缩方案,两者都可以用开源程序7zip解压缩。

第2步 将java2python文件夹的内容放在C:\驱动器的根目录下。

第3步 在没有引号的“python setup.py install”中键入之前,打开命令提示符并导航到“C:\ java2python \”。这将告诉Python解释器运行安装脚本并准备您的计算机。将目录更改为“C:\ java2python \ bin \”并保持窗口打开。

步骤4 在java2python下将要转换的Java文件复制到bin子文件夹中。在命令行中,运行“j2py -i input_file.java -o output_file.py”,将input_file和output_file替换为您的文件名。

第5步 打开新的Python文件夹并阅读代码。它可能不会是完美的,所以你需要重新审视它以确保从Python的角度来看它是有意义的。然而,即使花时间手动检查,您也可以节省手工转换的大量时间


1
2018-04-09 08:42



你也可以尝试一下 seelio.com/w/20mn/java-to-python-converter-wip。它有一个github项目,可用于将Java转换为Python程序。 - Sunil


  1. JAX-WS 2.2需要JAXB 2.2进行数据绑定。确保所有内容都已更新
  2. Schemagen具有编译范围依赖性。
  3. 生成xml文件的最佳做法:

    提供一个 package-info.java 用的文件 XmlSchema

    schemagen example.Address example\package-info.java

    使用 @XmlType 注释命名空间属性以指定命名空间

    @XmlType(namespace="http://myNameSpace")

解决了创建xml文件的问题后试试 lxml的objectify子包。 要么 迷你模块 迭代tml xml元素并创建Python类。


1
2018-04-10 10:25