gpt4 book ai didi

json - Gson Unicode字符转Unicode字符编码

转载 作者:行者123 更新时间:2023-12-05 06:40:13 30 4
gpt4 key购买 nike

在下面查看我的代码。我有一个包含 Unicode 字符代码的 JSON 字符串。我将它转换为我的 Java 对象,然后将其转换回 JSON 字符串。但是,您可以看到输入和输出 JSON 字符串不匹配。是否可以使用 Gson 将我的对象转换为原始 JSON 字符串?我希望 outputJsoninputJson 相同。

static class Book {
String description;
}

public static void test() {
Gson gson = new Gson();

String inputJson = "{\"description\":\"Tikrovi\\u0161kai para\\u0161ytas k\\u016brinys\"}";
Book book = gson.fromJson(inputJson, Book.class);
String outputJson = gson.toJson(book);

System.out.println(inputJson);
System.out.println(outputJson);
// Prints:
// {"description":"Tikrovi\u0161kai para\u0161ytas k\u016brinys"}
// {"description":"Tikroviškai parašytas kūrinys"}
}

最佳答案

很遗憾,Gson好像不支持。所有 JSON 输入/输出分别集中在 Gson(自 2.8.0 起)JsonReaderJsonWriter 中。 JsonReader 可以使用其私有(private)的 readEscapeCharacter 方法读取 Unicode 转义。但是,与 JsonReader 不同,JsonWriter 只是将字符串写入支持 Writer 实例,不对 127 以上的字符进行任何字符更正,\u2028 除外。和 

\u2029 .您在这里唯一可以做的可能是编写一个自定义转义 Writer,以便您可以发出 Unicode 转义。

final class EscapedWriter
extends Writer {

private static final char[] hex = {
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'a', 'b',
'c', 'd', 'e', 'f'
};

private final Writer writer;

// I/O components are usually implemented in not thread-safe manner
// so we can save some time on constructing a single UTF-16 escape
private final char[] escape = { '\\', 'u', 0, 0, 0, 0 };

EscapedWriter(final Writer writer) {
this.writer = writer;
}

// This implementation is not very efficient and is open for enhancements:
// * constructing a single "normalized" buffer character array so that it could be passed to the downstream writer
// rather than writing characters one by one
// * etc...
@Override
public void write(final char[] buffer, final int offset, final int length)
throws IOException {
for ( int i = offset; i < length; i++ ) {
final int ch = buffer[i];
if ( ch < 128 ) {
writer.write(ch);
} else {
escape[2] = hex[(ch & 0xF000) >> 12];
escape[3] = hex[(ch & 0x0F00) >> 8];
escape[4] = hex[(ch & 0x00F0) >> 4];
escape[5] = hex[ch & 0x000F];
writer.write(escape);
}
}
}

@Override
public void flush()
throws IOException {
writer.flush();
}

@Override
public void close()
throws IOException {
writer.close();
}

// Some java.io.Writer subclasses may use java.lang.Object.toString() to materialize their accumulated state by design
// so it has to be overridden and forwarded as well
@Override
public String toString() {
return writer.toString();
}

}

此作者未经充分测试,不尊重 \u2028\u2029。然后在调用 toJson 方法时配置输出目标:

final String input = "{\"description\":\"Tikrovi\\u0161kai para\\u0161ytas k\\u016brinys\"}";
final Book book = gson.fromJson(input, Book.class);
final Writer output = new EscapedWriter(new StringWriter());
gson.toJson(book, output);
System.out.println(input);
System.out.println(output);

输出:

{"description":"Tikrovi\u0161kai para\u0161ytas k\u016brinys"}
{"description":"Tikrovi\u0161kai para\u0161ytas k\u016brinys"}

这是一个有趣的问题,您也可以在 google/gson 上提出问题添加一个字符串写入配置选项——或者至少从开发团队那里得到一些评论。我确实相信他们非常清楚这种行为,并通过设计使它像那样工作,但是他们也可以对此有所了解(我现在唯一能想到的是目前他们有更多的性能而不是额外的在写入字符串之前转换,但这是一个薄弱的猜测)。

关于json - Gson Unicode字符转Unicode字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43091804/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com