当前位置: 首页 > 知识库问答 >
问题:

当类型为String或List时,JavaJSON反序列化

闻人修明
2023-03-14

是否有一种简单的方法来反序列化可以是字符串列表的值

我必须处理一个大的JSON,缩写如下:

{"A": {"item1": 1,
        ...
       "itemN": "SomeString",
        ...
       "itemM": 123.45},
 "B": { ... },
 "C": { ... },
 }

有时看起来是这样的:

{"A": {"item1": 1,
        ...
       "itemN": ["SomeString1", "SomeString2"],
        ...
       "itemM": 123.45},
 "B": { ... },
 "C": { ... },
 }

我反序列化:

MyData data = new Gson().fromJson(rxJSON, DataClass.class);

其中DataClass:

@Parcel
public class DataClass {
    @SerializedName("A")
    private AClass groupA;
    @SerializedName("B")
    private BClass groupB;
    @SerializedName("C")
    private BClass groupC;
    ... getters/setters ...
}

和类:

@Parcel
public class AClass {
    @SerializedName("item1")
    private int item1;
    ...
    @SerializedName("itemN")
    private List<String> itemN;
    ...
    @SerializedName("itemM")
    private float itemM;
    ... getters/setters ...
}

理想情况下,我希望对两个JSON都使用AClass,如果itemN字符串,只需将其视为单个元素列表即可

我看到过关于Polymophism解决方案的建议,以及建议尝试使用假定为一种类型(例如String)的类的一个版本反序列化,以及在异常捕获中使用假定为另一种类型(例如List)的类的一个版本反序列化的解决方案


共有1个答案

余弘毅
2023-03-14

由于以下原因,我找到了一个很好的解决方案:https://stackoverflow.com/a/31563539/3571110和https://stackoverflow.com/a/6205384/3571110

第一个链接显示了对整个JSON使用自定义反序列化器(对我来说工作太多了),并且在其中管理StringtoList

解决方案:

public class ListOrStringDeserializer implements JsonDeserializer<List<String>> {

    @Override
    public List<String> deserialize(JsonElement json, Type typeOfT,
                                    JsonDeserializationContext context) 
            throws JsonParseException {

        List<String> items = Collections.emptyList();
        if (json.isJsonArray()) {
            items = context.deserialize(json, List.class);
        } else if (json.isJsonPrimitive()) {
            items = Collections.singletonList((String) context.deserialize(json, String.class));
        }
        return items;
    }
}

然后在反序列化之前注册:

Gson gson = new GsonBuilder().registerTypeAdapter(new TypeToken<List<String>>() {}.getType(), new ListOrStringDeserializer()).create();
MyData data = gson.fromJson(rxJSON, DataClass.class);

 类似资料:
  • 问题内容: 我有一个具有两列的DataTable。ShipmentDate(DateTime)和Count(Int)。在对字符串反序列化之后,我发现如果第一个itemarray值为null,则ShipmentDate的类型将变为字符串。 检查以下示例。除了第一个数组项,两个json字符串都具有相同的数据。 在我的场景中,第一个项目数组的ShipmentDate可以为null,并且将其转换为字符串类

  • 问题背景: 我正在使用牛顿软件 JSON.NET 将 XML 响应从 AWS 服务解封为 C# 对象结构。 问题: 当我尝试反序列化 类属性时,我收到以下错误消息: 我应该补充一点,我无法控制返回的XML,反过来也无法控制我需要将响应反序列化为的大型对象结构。 代码: 以下是“ImageSet”的C#类模型 这是一个显示JSON响应的屏幕截图,突出显示了抛出错误的< code>Category属性

  • 我正在尝试在dropwzo资源中实现一个方法,该方法将为来自JS前端(使用DataTable)的调用提供服务。 该请求的查询参数如下所示: 列[0][数据]=0 列[1][数据]=iata 该请求来自用DataTables实现的JS前端,并使用服务器端处理。有关数据表如何在此处发送请求的信息: https://datatables.net/manual/server-side 我在定义上述查询参数

  • 由于Realm无法处理升级类型,包括s,所以我正试图实现一个,就像这个问题一样。 问题是,我对为什么会出现以下错误感到困惑: W/系统。呃:com。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN_对象,但为字符串 这是Json的一部分: 我的RealmString: 改装Pojo的一部分: 以及反序列化程序: 我在

  • 问题内容: 我的问题与这一问题非常相似,但是我没有足够的声誉对原始答案发表评论。 我有一个名为FillPDF的自定义类,该类在服务器上进行序列化并在客户端上反序列化。 该班由一个中包含的一个集合属性 通过阅读原始问题的解决方案,我知道了为什么将类型错误地设置为。我了解Json.Net 仅通过查看第一行来推断每个推断(我的第一行具有值)。 我试图从原始问题开始实施解决方案。dbc建议覆盖。我已经做到

  • 我正在使用gson进行改造,将json反序列化为领域对象。这在大多数情况下都很有效。处理问题时会出现麻烦 RealmList(字符串(或任何其他基本数据类型)) 由于Realm不支持RealmList,其中E不扩展Realm对象,所以我将字符串包装在RealmObject中。 我的领域对象如下 SimpleRealmObj工作正常,因为它只有字符串元素 如何反序列化stringStuff?我试过使