【问题标题】:How do I read JSON as String with Gson?如何使用 Gson 将 JSON 读取为字符串?
【发布时间】:2015-11-19 15:55:56
【问题描述】:

我从 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 是我的可序列化类的一个实例,我试图通过使用convertStreamtoString 方法将InputStream 对象转换为String 来在我的logcat 中打印JSON:

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

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

【问题讨论】:

  • 您正在从同一个输入流中读取两次。你不能那样做。您可以做的是先读取字符串,然后记录 fromJson 的调用,并将字符串作为参数

标签: android string gson inputstream logcat


【解决方案1】:

如果这对你来说真的很重要,Gson 可以接受String

我不建议将Stream 阅读两次,尽管您可以使用mark()reset() 来阅读。由于Gson 将反序列化StringReader,因此您可以像这样将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,但这会更慢。

【讨论】:

  • @JaviSanchezG 感谢您的勾选!你也因此获得了两个声望点!
【解决方案2】:

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

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

但您只想在 logcat 中打印您的 JSON,只需将 toString() 方法添加到您的 SNSRegister 类或更好的用户 Retrofit 日志记录机制即可。

【讨论】:

  • Some implementations support marking a position in the input stream,所以这可能有效也可能无效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
相关资源
最近更新 更多