不是那么典型的情况。
我有来自服务器的下一个JSON字符串:
{"SomeElements":[{"Id":"Title","Info":"{\"Text\": \"Sometext\"}"}]}
以下是它的图示:
问题是字符串Info
包含另一个JSON
字符串
这是我的POJO:
public class Test {
private ArrayList<SomeElement> SomeElements;
public class SomeElement {
private String Id;
private String Info;
}
}
问题 - 有没有办法解析Info
字符串不是字符串,而是在我的POJO中作为HashMap(例如)?
如果我尝试将其声明为HashMap<String, String>
,则会出现错误"Expected OBJECT, but was STRING"
。
处理此问题的最佳方法是什么?自定义反序列化器是唯一的方法吗?
!! 这个问题不重复!!
我无法从服务器更改JSON响应
请仔细阅读 - 我问,是否可以将Info
字符串解析为字符串,而不是另一种JSON。
解决方案我最后接下来了。
我声明private LinkedTreeMap<String, String> infoMap;
并首先将Info
反序列化为String。然后:
public LinkedTreeMap<String, String> getInfoMap() {
if (infoMap == null) {
infoMap = new Gson().fromJson(info, new TypeToken<Map<String, String>>(){}.getType());
}
return infoMap;
}
我认为这比编写自定义反序列化器要容易得多,但在更复杂的情况下,自定义反序列化器可能是唯一的选择。
所以在一般情况下,@ arjabbar的答案会更好。
答案 0 :(得分:1)
你有几个选择,但我认为你最好的选择是制作一个自定义的反序列化器。这不是你唯一的方法,但是一旦你习惯了编写反序列化程序,它就不那么糟了。
答案 1 :(得分:0)
这里的信息也是对象。所以你需要创建信息类。
public class Test {
private ArrayList<SomeElement> SomeElements;
public class SomeElement {
private String Id;
private Info info;
}
}
class Info{
private String text;
private String sometext;
//getter and setter
}
答案 2 :(得分:0)
您还需要为Info
对象创建一个类,以便GSON
为您反序列化它。
试试这个:
public class EntireJsonObject {
private ArrayList<SomeElement> someElements;
}
public class SomeElement {
private String id;
private Info info;
}
public class Info {
private String text;
}
您需要GSON
将服务器的JSON
响应反序列化为EntireJsonObject
。 GSON
将为您处理所有内部转换和反序列化。现在您可以访问&#34; SomeText&#34;通过来自Info
对象的吸气剂。
请务必注意,您的变量名不必须与JSON
响应中返回的密钥完全匹配。 GSON
将根据各种方案(camelCase,under_scores等等)翻译变量名称。您可以指定创建对象时使用的转换协议GSON
。
如果您绝对希望将Info
作为HashMap<String, String>
,则必须单独编写反序列化器。我会查看GSON
文档,因为您可能不必为整个JSON
响应编写自定义反序列化程序,而只需编写内部对象。