GSON如果反序列化的字符串包含另一个JSON

时间:2016-06-09 18:21:12

标签: android json gson

不是那么典型的情况。

我有来自服务器的下一个JSON字符串:
{"SomeElements":[{"Id":"Title","Info":"{\"Text\": \"Sometext\"}"}]}

以下是它的图示:

enter image description here

问题是字符串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的答案会更好。

3 个答案:

答案 0 :(得分:1)

你有几个选择,但我认为你最好的选择是制作一个自定义的反序列化器。这不是你唯一的方法,但是一旦你习惯了编写反序列化程序,它就不那么糟了。

Here are some decent examples.

答案 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响应反序列化为EntireJsonObjectGSON将为您处理所有内部转换和反序列化。现在您可以访问&#34; SomeText&#34;通过来自Info对象的吸气剂。

请务必注意,您的变量名必须与JSON响应中返回的密钥完全匹配。 GSON将根据各种方案(camelCase,under_scores等等)翻译变量名称。您可以指定创建对象时使用的转换协议GSON

如果您绝对希望将Info作为HashMap<String, String>,则必须单独编写反序列化器。我会查看GSON文档,因为您可能不必为整个JSON响应编写自定义反序列化程序,而只需编写内部对象。