如何使用 Gson 将 JSON 读取为字符串?

How do I read JSON as String with Gson?

我从 WebService 得到一个 Json,我想在我的 LogCat 中将它打印为 String。我尝试了以下方法:

Gson gson = new Gson();
HttpEntity getResponseEntity = httpResponse.getEntity();
InputStream is = getResponseEntity.getContent();
Reader reader = new InputStreamReader(is);
Type snsType = new TypeToken<SNSRegister>(){}.getType();
snsRegister = gson.fromJson(reader, snsType);
String jsonString = convertStreamToString(is);

snsRegister 是我的可序列化 class 的一个实例,我试图通过转换 InputStream 对象在我的 logcat 中打印 JSON使用 convertStreamtoString 方法 String

static String convertStreamToString(java.io.InputStream is) {
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\A");
    return s.hasNext() ? s.next() : "";
}

但是我的字符串总是空的,我不知道为什么。 snsRegister 不为空,所以这不是问题所在。

很可能您的流已被 GSON 读取一次。

如果您真的非常想读两遍,您需要 reset() 一个流,但首先您必须 mark() 您想要重置的位置。

但是你想要的只是在 logcat 中打印你的 JSON 只需将 toString() 方法添加到你的 SNSRegister class 或者更好的用户 Retrofit 日志记录机制。

如果这对您来说真的很重要,Gson 可以参加 String

我不建议阅读 Stream 两遍,尽管您可以阅读 mark()reset()。由于 Gson 除了 Reader 之外还会反序列化 String,所以你可以像这样将 String 传递给 Gson:

HttpEntity getResponseEntity = httpResponse.getEntity();
InputStream is = getResponseEntity.getContent();
String jsonString = convertStreamToString(is);
Log.i("MyTAG", jsonString);

Gson gson = new Gson();
Type snsType = new TypeToken<SNSRegister>() {}.getType();
snsRegister = gson.fromJson(jsonString, snsType);
        

我不建议在生产环境中这样做,因为转换为 String 需要大量额外工作。但是显然,您可以暂时使用它进行调试;您目前使用的方式是生产的最佳方式。

另一种选择是使用 gson.toJson()SNSRegister 对象转换回 JSON,但那样会更慢。