【问题标题】:How to serialize/deserialize partial JSON object using GSON?如何使用 GSON 序列化/反序列化部分 JSON 对象?
【发布时间】:2017-09-11 08:15:07
【问题描述】:

我有非常复杂的 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 的字段,但它们会在需要时正确序列化。

【问题讨论】:

  • 不清楚:但是对象有很多我不需要的字段,但是当我在“a”和“b”中进行更改时,它们应该序列化。您自相矛盾。你不是他们,还是他们应该序列化?!你不能两全其美。
  • @GhostCat JSON 来自某个地方,我必须对其进行修改和序列化并将其发送到某个地方......其他一些应用程序(后端)需要那些我不需要的字段,我只需要通过。
  • 您尝试过使用JSONObject 实例吗?因为 JSON 中的内容并不重要,您始终可以只操作选定的字段。所以,真的没有必要仅仅为了能够操作一些选定的字段而创建“部分 JSON”。
  • @ZeekHuge 我需要 GSON 的东西
  • 我认为你没有得到它。 GSON 是将 Java 对象转换为 JSON,以便您能够对其进行序列化(这意味着 JSON 对象可以很容易地序列化)。但是您已经有了 JSON,无需使用 GSON 即可轻松对其进行序列化。只需将其转换为字符串。就如此容易。当您想要将对象从应用程序的一个组件传输到另一个组件时,通常需要序列化。

标签: java android json gson


【解决方案1】:

您可以使用JsonElement。例如:

 class DataObject{

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


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

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

        ...

 }

【讨论】:

  • OP 提到他有 100 个字段。他需要对所有这些字段执行此操作吗?
  • 您必须定义顶级字段,但会处理嵌套字段。
【解决方案2】:

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

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

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

您查看模型示例。

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

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2011-12-23
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多