2016-06-09 97 views
0

不是那么典型的情况。

我有一个从服务器下一个JSON字符串:
{"SomeElements":[{"Id":"Title","Info":"{\"Text\": \"Sometext\"}"}]}GSON如果反序列化的字符串包含另一个JSON

这里是它的图形表示:

enter image description here

的问题是,串Info包含另一个JSON字符串。
这里是我的POJO:

public class Test { 
    private ArrayList<SomeElement> SomeElements; 

    public class SomeElement { 
     private String Id; 
     private String Info; 
    } 
} 

问题 - 是有一些方法来分析Info字符串不是字符串,而是作为HashMap中(例如)在我的POJO?

如果我尝试将其声明为HashMap<String, String>,则出现错误"Expected OBJECT, but was STRING"

什么是处理这个问题的最佳方法?自定义解串器是唯一的方法?


!!这个问题不是重复的!
我无法更改服务器的JSON响应。
请仔细阅读 - 我问,是否有可能解析Info字符串不是字符串,而是另一个JSON。

解决方案我结束了下一个。
我宣称private LinkedTreeMap<String, String> infoMap;并首先反序列化Info作为字符串。然后:

public LinkedTreeMap<String, String> getInfoMap() { 
      if (infoMap == null) { 
       infoMap = new Gson().fromJson(info, new TypeToken<Map<String, String>>(){}.getType()); 
      } 
      return infoMap; 
     } 

我想这是不是编写自定义解串器更容易,但也许在更复杂的情况下,自定义解串器将是唯一的选择。
因此,通常情况下@arjabbar的答案会更好。

+0

你为什么要这样做? – once2go

+0

简单 - 我想解析从服务器端的响应到一个可用的类。 –

回答

1

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

Here are some decent examples.

+0

是的,我想定制Deserializer将是唯一的选择。 Info是一个字符串的主要问题 - 如果它嵌套JSON,那很容易。 –

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 
} 
+0

它不工作,因为信息是一个字符串:'com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:期望的BEGIN_OBJECT,但是在第1行第46列STRING' –

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序列化从服务器到EntireJsonObjectJSON响应。GSON将为您处理所有内部转换和反序列化。现在,您可以通过Info对象的吸气器访问“SomeText”。

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

如果你绝对想Info作为HashMap<String, String>,你将不得不单独写的解串器。我会检查GSON文档,因为您可能不必为整个JSON响应编写自定义解串器,而仅仅是内部对象。

+0

谢谢,但它不工作 - 原因是相同的 - Info是一个字符串:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:期望的BEGIN_OBJECT,但是在第1行第46列的STRING# –

+0

@GoltsevEugene啊,我明白了。我没有注意到整个领域被封装在引号中。在这种情况下,你将不得不使用一个自定义的反序列化器作为上面提到的arjabbar – omkarmoghe

相关问题