将非 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
变量。
我试图想出一个好的解决方案来将字符串转换为 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
变量。