如何让 Gson 将值读取为字符串?

How to make Gson read value as String?

我的 JSON 对象看起来像这样

{"phoneNbr":"123456789","firstName":"Mark","previousNames":[{"previous1":"Peter","previous2":"Steve"}]}

{"phoneNbr":"234567891","firstName":"Hank","previousNames":null}

previousNames 值可以是任何值。我希望它始终被视为 STRING。但是,当我尝试解析它时,GSON 抱怨说它需要数组。


PersonJsonDAO class 看起来像这样

private String phoneNbr; 
private String firstName; 
private String previousNames; 

我尝试解析它,但 GSON 说 Expected a string but was BEGIN_ARRAY

PersonJsonDAO personJsonDAO= new Gson().fromJson(jsonString, PersonJsonDAO.class); 

如何强制 GSON 接受 previousNames 作为 String

GSON 把它当作一个数组,因为它确实是一个数组:) 我可以想到 4 种不同的选择来满足您想要的行为:

  1. 一个预处理步骤,通过搜索第一次出现的“"previousNames":[”,将“"previousNames":”之后的所有内容转换为字符串,并在其中插入一个“ "',退格所有双引号,直到出现']',在这之前我会添加另一个双引号。

  2. 一个更简单的解决方案,如果你不介意轻微的计算开销,在你的情况下可能很小,就像你一样,第一步解析为 JSON做了,但是将 previousNames 声明为字符串数组,然后调用:

    personJsonDAO.getString("previousNames"); 但是,这将使您留下 previousNames 字段作为字符串数组。

  3. 另一种选择是在反序列化过程中将其保留为 JSonObject,如下所示: class PersonJsonDAO { .... @SerializedName("previousNames") JsonObject previousNames; .... }

  4. 如果以上方案还不够,而你又坚持把previousNames字段做成String,那么最全面最正确的做法就是重写GSON的反序列化过程,调用super for所有行为,除了遇到 previousNames 罪魁祸首时,您将 return 作为字符串。