首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泽西/Genson: Unmarschalling单个对象数组

泽西/Genson: Unmarschalling单个对象数组
EN

Stack Overflow用户
提问于 2015-03-18 17:39:24
回答 1查看 488关注 0票数 0

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

代码语言:javascript
复制
{"fileInfo":[{"fileName":"weather.arff","id":"10"},"fileName":"supermarket.arff","id":"11"}]}

对比

代码语言:javascript
复制
{"fileInfo":{"fileName":"weather.arff","id":"10"}}

我正在使用泽西/Genson解析/解组JSON。当然,如果JSON与目标类不匹配,我会收到一个错误(如expected [ but read '{' )

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

和往常一样,如果有几种解决方案的话,我会提出最无密码的可能性.

顺便说一句: Moxy工作,但它不封送本地对象类型的对象,这是另一个要求.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-19 10:23:02

更新

Genson 1.3版本开始,您可以通过启用permissiveParsing来实现它:

代码语言:javascript
复制
Genson genson = new GensonBuilder().usePermissiveParsing(true).create();

答案

你知道是哪个库在服务器端产生这个吗?我很想知道是谁干的那些糟糕的杂事.

在Genson中还没有得到支持。原来是因为国际海事组织的人不应该产生这样有活力的json。无论如何,我打开了问题 -这可以很容易做到,你可以期待它出现在下周的发行版。

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

代码语言:javascript
复制
import com.owlike.genson.convert.DefaultConverters.CollectionConverterFactory;
import com.owlike.genson.convert.DefaultConverters.CollectionConverterFactory;


class SingleObjectAsCollectionFactory 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 );
      }
    };
  }
}

然后注册

代码语言:javascript
复制
Genson genson = new GensonBuilder()
                  .withConverterFactory(new SingleObjectAsCollectionFactory())
                  .create();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29129002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档