java - 将非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)。
解决方案
如果您收到的字符串不遵循已知标准(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>
. 那时,您可以使用任何库(如果您想要 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
使用正确的库根据需要序列化您的变量。
推荐阅读
- python-3.x - 无法弄清楚 Codewars Growth of a Population kata 中的错误
- c# - 在 MSTest 中,如何指定某些测试方法不能相互并行运行?
- jquery - 更改其类后删除此元素
- windows - 在 Windows CMD 中提取给定的祖先路径形成更深的路径
- java - 将 Univocity 解析器与 Spring Batch 一起使用
- java - 有没有办法从 TextView 变量中选择特定字符?
- ios - Xcode 应用程序布局不适用于所有设备
- docker - 如何正确设置 Docker 容器以进行本地卷曲?
- java - 何时在 Java 中使用 Identity 函数?
- python - 检查具有特定名称的多个文件是否到达目录中。只有当他们到达时继续或继续寻找那些文件