将非 json 字符串转换为 json 的最佳方法?

Best ways to convert non-json string to 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)。

如果您收到的字符串不遵循已知标准(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;
    }
}

您需要做的是将您的 String 解析为 List<Book>。那时,你可以使用任何库(如果你想要 Jackson Json,Jaxb 如果你想要 Xml 等)来注释你的 POJO 并让库 serialize/deserialize 为你。

为了解析您的 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 变量。