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

Jersey/Genson:解组单个对象数组

莘光华
2023-03-14

类似于Jersey:带有1个元素的Json数组被序列化为object,但在客户端。例如,我收到一个JSON对象,其中一个字段是一个数组,但如果只有一个元素,它就是一个单独的对象。

{"fileInfo":[{"fileName":"weather.arff","id":"10"},"fileName":"supermarket.arff","id":"11"}]}

{"fileInfo":{"fileName":"weather.arff","id":"10"}}

我正在使用 Jersey/Genson 解析/取消编组 JSON。当然,如果JSON与目标类不匹配,我会收到错误(例如预期的[,但读作'{'

我已经阅读了很多关于这个错误以及如何在服务器端创建JSON对象时如何避免的信息,但是我没有发现任何关于在客户端处理时如何处理这个issus的信息。

和往常一样,如果有几种解决方案,我更喜欢最无代码的可能性...

顺便说一句:Moxy可以工作,但它不列表本机Object类型的对象,这是另一个要求...

共有1个答案

赵英哲
2023-03-14

更新

从Genson 1.3版本开始,您可以通过启用许可分析来实现:

Genson genson = new GensonBuilder().usePermissiveParsing(true).create();

回答

呃,你知道哪个库在服务器端生成这个吗?我很想知道谁应该对那些糟糕的jsons负责...

Genson 中尚不支持此功能。最初是因为IMO人不应该产生这样的动态json。无论如何,我打开了一个问题 - 这可以很容易地完成,你可以期待它出现在下周的版本中。

否则,这是在不破坏现有机制的情况下实现它的方法。您需要注册一个工厂,该工厂将使用 Gensons 集合工厂创建其标准集合转换器的实例。然后,您将此转换器包装在另一个转换器中,该转换器将处理对象到数组逻辑。这是代码(不是无代码的...,但如果你稍等一会儿,你就不必:)编码)。

import com.owlike.genson.convert.DefaultConverters.CollectionConverterFactory;
import com.owlike.genson.convert.DefaultConverters.CollectionConverterFactory;


class SingleObjectAshtml" target="_blank">CollectionFactory implements Factory<Converter<Collection>> {
  // get the default factory
  Factory<Converter<Collection<?>>> defaultFactory = CollectionConverterFactory.instance;


  @Override
  public Converter<Collection> create(Type type, Genson genson) {
    // obtain an instance of the correct default converter for this type
    final CollectionConverter defaultConverter = (CollectionConverter) defaultFactory.create(type, genson);

    // wrap it in your own converter
    return new Converter<Collection>() {

      @Override
      public void serialize(Collection object, ObjectWriter writer, Context ctx) throws Exception {
        defaultConverter.serialize(object, writer, ctx);
      }

      @Override
      public Collection deserialize(ObjectReader reader, Context ctx) throws Exception {
        if (reader.getValueType() == ValueType.OBJECT) {
          Object object = defaultConverter.getElementConverter().deserialize(reader, ctx);
          Collection result = defaultConverter.create();
          result.add(object);
          return result;
        } else return defaultConverter.deserialize( reader, ctx );
      }
    };
  }
}

然后注册

Genson genson = new GensonBuilder()
                  .withConverterFactory(new SingleObjectAsCollectionFactory())
                  .create();
 类似资料:
  • 问题内容: 我要解组的单元素JSON数组: 相应的Java类(为简便起见,省略了getters和setters方法): 发出HTTP请求的Jersey客户代码, 应该 将上述JSON解组为一个元素: 最后一行,特别是调用,抛出以下异常: 我已经尝试在上使用各种注释组合,或者使用数组代替: 或使用中间体: 但到目前为止,没有一个解决了这个问题。 更令人困惑的是,我现有的设置在解组其他结构内部的JSO

  • 我使用Nodejs,有一个对象包含一个object数组(API请求的结果)和一个简单的值数组。 它们看起来是这样的: 如何将包含对象数组的对象与简单数组进行比较? 我要找的是,从简单数组中获取ID,并将它们与另一个“复杂”对象进行比较,以检索属性以及简单数组中的相应ID和另一个对象属性,然后将结果存储在一个对象数组中。 简单来说,我希望有这样的结果: 当从API请求中检索“复杂”对象时,我尝试了以

  • 快速介绍(可以跳过):嗨,有很多关于这个主题的问题和答案,但是有时候解决方案很简单,你甚至都没想过,因为我已经浪费了很多时间,所以我想发布一个对所有答案的补充。 问题:您有一个JSON REST服务,它处理POST请求以保存JSON对象,但该对象包含Genson未开箱即用解析的Date字段。 Java对象: 球衣的其余服务: 使用jQuery的javascript客户端:

  • 问题内容: 问题在于确定以下符号之间的权衡: 基于JSON : 基于数组 : 关于同一问题的这篇文章,我已经决定(在前端)使用JSON对象表示法而不是对象数组,因为它符合我的要求,更好的性能和更少的浏览器代码。 但是问题在于列表本身不是静态的。我的意思是,该列表正在生成,即从DB(NoSQL)获取/存储,并通过服务器上的JavaAPI为新条目创建。我无法决定在后端应使用哪种表示法(最终也会影响UI

  • 我正在用Jersey/Java创建一个REST服务器,我发现了一个奇怪的行为。 我在服务器上有一个方法,它将对象数组作为Json返回 代码被正确执行,数据被返回给客户机(一个jQuery ajax调用)。问题是,如果“结果”数组有一个或多个元素,则返回数据的格式会改变。 用一个元素响应: 回应有两个要素: 如您所见,在第一种情况下,返回对象的“fileInfo”属性的值是一个对象,在第二种情况下,