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

3

我有非常复杂的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进行混合对象序列化。
C#示例。
 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
不清楚:但是对象有许多我不需要的字段,但当我在“a”和“b”进行更改时,它们应该序列化。 你自相矛盾。你是不需要它们,还是应该序列化?你不能两者兼得。 - GhostCat
1
@GhostCat JSON来自某个地方,我必须修改并将其序列化回发送到某个地方...其他应用程序(后端)需要那些我不需要的字段,我只需要传递。 - s.kava
2
你尝试使用 JSONObject 实例了吗?因为 JSON 中有什么并不重要,你总是可以只操作选定的字段。所以,没有必要创建一个“部分 JSON”来仅仅能够操作一些选定的字段。 - zeekhuge
@ZeekHuge 我需要一些关于GSON的东西。 - s.kava
现在,这使得你真正想要的变得清晰明了。我不确定GSON是否能够做到这一点。如果符合您的需求,我建议您应该扩展JSONObject类,例如ServerResponse extends JSONObject,并添加方法doThisWithA()doThisWithB()来使其工作。 - zeekhuge
显示剩余2条评论
2个回答

2
您可以使用JsonElement。例如:
 class DataObject{

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


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

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

        ...

 }

1
OP提到他有数百个字段。他需要对所有这些字段都这样做吗? - zeekhuge
1
你需要定义顶级字段,但嵌套字段将被处理。 - Akash Kava

0

我认为这是解决方案。创建一个视图模型并创建get和set方法。

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,例如:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接