java - 将 Java 类结构转换为 Python 类

标签 java python xml oop jaxb

我们正在努力避免在同时使用 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 Schemas 作为中介进行了研究,但这也并没有真正解决它,因为从 JSON 模式创建 Python 类源代码并不容易。

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

最佳答案

So is there any way to generate simple "Pojo" Python classes from Java code?

我试了一下,下面是解决方案:

考虑下面简单的 Pojo.java

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

该解决方案将需要 3 个阶段

1。 Java Pojo 到 JSON 模式

我可以找到以下选项:

  1. FasterXML/jackson-module-jsonSchema : 这是基础,下面的库也在内部使用。
  2. mbknor/mbknor-jackson-jsonSchema : 上面官方引用,支持json schema的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 后处理

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

我们可以在上面的步骤1 的java 程序中轻松完成这些作为post 步骤。我们需要以下形式的 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 模式生成器将仅在输出中包含那些公共(public)属性或具有公共(public) getter 的属性。
  2. 我认为对于大规模迁移,注释 Java 类会很痛苦。否则,如果这对您可行,上述所有 Java 库都提供了丰富的注释,您可以在其中指定某个属性是否是必需的等等。

关于java - 将 Java 类结构转换为 Python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630662/

相关文章:

java - 从 XML 呈现设计器时出现 NullPointerException

java - 为什么打印出0呢?

java - 我的网络应用程序如何从 Tomcat 库中识别 JAR

python - 使用 PIL 从文件夹加载所有图像

python - 使用 Python 展平和解压字典

php - 从 xml 中检索 vimeo 视频信息

java - 处理异常的 throws 语句——Java

java - 无法从 Access 数据库检索数据

python - 使用 pandas 获取每个唯一行项目的时间差

Java:使用 JaxB 编码到 XML,如何正确地进行多线程