【问题标题】:Create JSON File Serializing the class in Java在 Java 中创建 JSON 文件序列化类
【发布时间】:2016-07-12 16:58:07
【问题描述】:

我有以下课程:

public class PDFValues {
    private String value;
    private int xPos;
    private int yPos;

    public PDFValues(){

    }

    public PDFValues(String value, int x, int y){
        this.setValue(value);
        this.setX(x);
        this.setY(y);
    }

    public void setValue(String value){
        this.value = value;
    }

    public void setX(int x){
        this.xPos = x;
    }

    public void setY(int y){
        this.yPos = y;
    }

    public String getValue(){
        return this.value;
    }

    public int getX(){
        return this.xPos;
    }

    public int getY(){
        return this.yPos;
    }
}

然后我想这样做:

public class PDFtoJSONTest {    

    public static void main(String[] args) {
        List<PDFValues> listaElementos = new ArrayList<PDFValues>();

        listaElementos.add(new PDFValues("Anubis Lockward Botello",
                           new Integer(100), new Integer(633)));

        ....more code

    }

}

我想做的是将ArrayList中的所有PDFValues保存为JSON文件,但我不知道如何使其自动化,我想过序列化对象或其他东西,但我找不到一个解决方案,我不确定如何使 PDFValues 对象可序列化。

我想这样做以将这些值保存在 JSON 文件中,然后将它们用作生成 PDF 文件的属性,我使用 PDFBox 生成 PDF 文件,使用 SimpleJSON 生成 .json 文件。

我正在从事一个项目,我必须从一些处理过的数据中生成数千个 pdf 文件。我已经设法解析了包含大约 500 多 MB 文本的数据,并包含大约五千个需要生成为 PDF 的帐户报表。

问题是,由于文本数据是在 PDF 中生成的,因此需要将字符串中起始字符的位置指示为 PDFValues,以生成 PDFTextInfo 对象,然后将其添加到 PDF 中,文件将需要包含图片和文字等内容。

注意:如果有更好的方法来完成我正在尝试做的事情,我愿意接受建议,但我也想知道我正在尝试做的事情的答案,并知道它是否可行与否,以及这两种情况的原因。

我想让我的代码尽可能快,现在我可以在 2 分钟内处理整个 TXT 文件从 RAW 到大部分清理数据,我知道它可能会被优化,但现在不是重点:D

我想尽可能快地生成 PDF 文件,但我已经在 J​​ava 中使用该项目大约 1 1/2 个月了,我只了解了 JSON 和 PDF 文件生成过去一周...处理 JSON 文件已经三天了,我有点迷茫。

这是我尝试完成的 JSON 文件的文件输出示例,这是我手动生成的,并且我设法读取和处理了该文件,现在我正在尝试自动生成它:

{ “标题”:{ “全名”: { “名称”:“阿努比斯·洛克沃德·博泰罗”, “水平”:180, “垂直”:633 }, .....更多元素...... } }

如您所见,我试图将 pdf 文件中的元素划分为面板,如 HEADER、BALANCES、TRANSACTIONS 和其他东西,并构建 PDF 文件,就好像它们是拼图一样,但是现在我正在尝试在标题上“构建”名称元素。

【问题讨论】:

    标签: java json pdf serialization


    【解决方案1】:

    我想有一种比编写然后重新读取文件更好的方法来构建 PDF 文件,但我可以为您的 JSON 问题提供一个答案。

    使用 Apache commons-lang3 库并查看 ToStringBuilder。然后,您可以在对象上定义 toString() 方法并使用内置的 ToStringStyle.JSON_STYLE 格式。然后,您必须将 PDFValues 列表包装在可以存储 Header、FullName 等的 PDFValue 的其他对象中。

        @Override
    public String toString() {
    
        return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
                .append("Name", value)
                .append("Horizontal", xPos)
                .append("Vertical", yPos)
    
                .toString();
    }
    

    我应该注意,您可以引入 Jackson 或类似的库,使用所需的 JsonProperty 注释来注释您的对象,并使用该库将您的对象序列化为 JSON,就像您对 REST 或类似的一样。但是,对于像您这样的简单用例,ToStringBuilder 既简单又有效。

    【讨论】:

    • 感谢您的回答,但是,构建 PDF 文件的更好方法是什么?我知道写入然后通过读取另一个文件生成它可能有点慢,但我找不到更好的方法的答案......我知道必须有一个
    • 好久没做PDF生成了,记不得当时用的库的名字了(编辑:是iText。我相信是开源的项目,但我确信有一些库可以处理这个问题。查看 iTextPDFBox 看看它们是否适合您的 PDF 需求。
    • 我说我用的是PDFBox 哈哈,反正我不知道有什么更好的方法来生成de PDF文件,不管怎样,非常感谢你的帮助,我找到了一种方法来应用什么您建议,我在 toString 方法中创建了 ToStringBuilder,现在我将使用装饰器“包装”元素内的值,然后将其放入“容器”中......我将发布代码解决方法,感谢您的帮助
    【解决方案2】:

    好的,感谢 JudgingNotJudging,我设法做到了这一点,我所做的是接受他的回答并将装饰器模式应用于对象,这样我就有了一个 PDFValue,它位于 PDFElement 内,它是 PDFContainer 的一部分,所以它是这样的:

    Header: (this is our PDFContainer)
      FullName: (so, Header HAS-A FullName element)
        PDFValue: (and FullName HAS-A a PDFValue, that has the Name or value to be   shown, and the X and Y coordinates inside the PDF)
    

    代码如下:

    PDFValue类还是一样的,我根据JudgingNotJudging的回答添加了覆盖的toString()方法。

    public class PDFValuesDecorator extends PDFValues{
    
    }
    

    在 PDFValuesDecorator 中,我们什么都不做,我们只是要扩展 PDFValues,以便我们拥有想要添加行为的类的正确类型,并且仍然为我们可能的所有不同类获得一个通用类型以这种方式创建。

    public class PDFElement extends PDFValuesDecorator {
        private PDFValues pdfValue;
        private String elementID;
    
        public PDFElement(PDFValues pdfValue, String elementID){
            this.pdfValue = pdfValue;
            this.elementID = elementID;
        }
    
        @Override
        public String toString() {      
            return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
                    .append(elementID, pdfValue.toString())
                    .toString();
        }
    
    }
    

    在构造函数中,我们保存了我们试图“包装”的对象的实例,以便我们可以向它“添加”一些东西。在这种情况下,我们为元素添加了一个 ID,并且我们正在修改元素的 toString() 方法,使其也包含 PDFValue 的 toString() 方法,以便它们都以适当的方式显示它们的两个值顺序。

    最后,这是我的主要方法:

    public class PDFtoJSONTest {    
    
        public static void main(String[] args) {
            List<PDFValues> listaElementos = new ArrayList<PDFValues>();
    
            PDFValues name = 
                    new PDFValues(
                                   "Anubis Lockward Botello",
                                   new Integer(100), 
                                   new Integer(633)
                                 );
    
            PDFElement fullName = new PDFElement(name, "FullName");
            PDFElement header = new PDFElement(fullName, "Header");
    
            listaElementos.add(header);
    
            for(PDFValues value : listaElementos){              
                System.out.println("Valor: " + value.toJSONString());           
            }
        }
    }
    

    如您所见,我做的第一件事是创建 PDFValues 的 ArrayList,然后为名称值创建一个对象,然后将该名称包装在 FullName 元素中,然后将其存储在 Header 元素中。如您所见,我可以传递 List 对象并随心所欲地使用它。

    此外,我可以创建其他 PDFElement,例如图像和其他东西,我可以将它们全部保存在 ArrayList 中并传递它们,然后当我想保存它们时,我只需调用一次 toString 方法,我会得到正确的输出,顺便说一句,这是 JSON 字符串的结果值:

    Valor: {"Header":"{"FullName":"{"Name":"Anubis Lockward Botello","Horizontal":100,"Vertical":633}"}"}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2016-11-14
      • 2012-05-21
      • 1970-01-01
      相关资源
      最近更新 更多