如何使用GSON序列化/反序列化部分JSON对象?

时间:2017-09-11 08:15:07

标签: java android json gson

我有非常复杂的JSON,有很多来自后端的嵌套字段,例如,

{
   "a": ...
   "b": ...
   "not-required-1":{
       "not-required-2":[
           ...
       ]
       ..
   },
   "not-required-3":{
       "not-required-4":[
           ...
       ]
       ...
   }
}

我只对“a”和“b”感兴趣,我可以映射到值的相应类型。但是对象有许多我不需要的字段,但是当我在“a”和“b”中进行更改时,它们应该序列化。

如果我只创建带有“a”和“b”的类型,当我序列化我的对象时,所有“不需要”的字段都消失了。唯一的选择是将不需要的每个字段映射到相应的Java类,但它们的数量为100。

澄清

后端发送JSON,它在我的代码中处理,我需要将JSON发送回后端..虽然我不需要处理所有字段,但这并不意味着后端不需要它们。

我想将传入的JSON转换为POJO并在整个应用程序中使用它,并使用GSON将其序列化为JSON。

C#的JSON.NET库支持使用Json.Linq进行hybird对象序列化。

c#example。

 class DataObject{

      [JsonProperty("a")]
      DataA A {get;set;}

      [JsonProperty("b")]
      DataB B {get;set;}

      [JsonProperty("not-required-a")]
      Json.Linq.JsonElement NotRequiredA {get;set;}

      [JsonProperty("not-required-b")]
      Json.Linq.JsonElement NotRequiredB; {get;set;}

 }

在C#中,我不需要映射NotRequiredA和NotRequiredB的字段,但是在需要时它们会正确序列化。

2 个答案:

答案 0 :(得分:2)

您可以使用JsonElement。例如:

 class DataObject{

        @Expose @Serialize("a")
        DataA A;


        @Expose @Serialize("b")
        DataB B;

        @Expose @Serialize("not-required-a")
        JsonElement NotRequired;

        ...

 }

答案 1 :(得分:0)

我认为这是解决方案。 制作视图模型并制作get和setter方法。

YourClass class = gson.fromJson(jsonText , YourClass .class);   
class.getA();
class.getB();

指出:对于gson,您应该在json文本中实现所有功能。 例如,您有一个名为not-required-1的对象。 创建一个not-required-1类,并在该类中设置not-required-2数组。

你viewModel示例。

public class ViewModel(){
   A a;
   B b;
   not-required-1 Not-required-1;
}

你不需要1例如:

public class not-required-1(){
   ArrayList<String> not-required-2 = new ArrayList<String>();
}

你不需要1例如: