首页 > 解决方案 > 将非json字符串转换为json的最佳方法?

问题描述

我试图想出将字符串转换为 json 格式的好解决方案,但我不知道它是否足够好。

String str = "[(Name:"What We "Need" In Life"Author:"David D."FileSize:2.17)(Name:"The House Of Owls"Author:"Carlos")(Name:"A Poor Wise Man"Author:"Steve Bark"FileSize:1.31)]";

我想也许我会使用 str.replace from ( to { 并在 }{ 之间插入逗号,但是我怎样才能找到要插入的索引?那么 Name,Author,FileSize 的 "" 呢?然后转换为可读的 json 字符串我可以序列化为 json(通过 gson/jackson)。

标签: javajsonspringserialization

解决方案


如果您收到的字符串不遵循已知标准(Json、Xml...)但它仍然具有已定义的结构,那么您需要将字符串解析为最适合您的结构。

在您的示例中,字符串似乎具有以下结构:

  • 被包裹的书籍清单[...]
  • 每本书都包裹在(...)
  • 每本书里面都有一个Name,一个Author,有时还有一个FileSize

所以基本上你的 POJO 如下:

public class Book {
    private final String name;
    private final String author;
    private final double fileSize;

    public Book(String name, String author, double fileSize) {
        this.name = name;
        this.author = author;
        this.fileSize = fileSize;
    }
}

您需要做的是将您的解析StringList<Book>. 那时,您可以使用任何库(如果您想要 Json,则为 Jackson,如果您想要 Xml 等,则为 Jaxb)来注释您的 POJO,并让库为您序列化/反序列化。

为了解析您的String,以下方法应该有效:

    //First, extract all the books (text between two parentheses):
    Pattern bookPattern = Pattern.compile("\\(([^()]*)\\)");
    Matcher bookMatcher = bookPattern.matcher(str);
    List<String> rawBooks = new ArrayList<>();
    while (bookMatcher.find()) {
        rawBooks.add(bookMatcher.group(1));
    }

    //Then for each book extracted separate the name (string), author (string) and fileSize (number):
    List<Book> books = new ArrayList<>();
    rawBooks.forEach(rb -> {
        String name = rb.split("Name:")[1].split("Author")[0];
        boolean hasFileSize = rb.contains("FileSize");
        String author;
        double fileSize;
        if (hasFileSize) {
            author = rb.split("Author:")[1].split("FileSize")[0];
            fileSize = Double.parseDouble(rb.split("FileSize:")[1]);
        } else {
            author = rb.split("Author:")[1];
            fileSize = 0;
        }
        books.add(new Book(name, author, fileSize));
    });

现在books使用正确的库根据需要序列化您的变量。


推荐阅读