【问题标题】:How to handle uncertain Json using Java Jersey如何使用 Java Jersey 处理不确定的 Json
【发布时间】:2014-06-02 20:20:37
【问题描述】:

我今天从一位同事那里得到了这个问题。假设我们有一个像这样的 Json 字符串:

{people:{name:Carlos}}

所以我有一个简单的类来处理这个 Json 字符串,它看起来像这样:

@XmlRootElement
class PeopleHandler(){

    public Person people;

}

有时 Json 字符串会提供一个人员列表,如下所示:

{people:[{name:Carlos}, {name:Michel}]}

我的问题是:如何更改我的 PeopleHandler 类来管理这种输入,有什么注释可以提供帮助吗?

注意:主要问题是我可以接收此处示例的任何 Json 字符串。所以我的班级必须能够同时支持两者。

注意 2:我无法控制输入,它是由网络服务提供的。我知道只要有一个对象,我就可以检查 Json 并使用列表构建副本,但我一直在寻找更优雅的解决方案。

【问题讨论】:

    标签: java json jersey


    【解决方案1】:

    您可以使用 JsonDeserialize 注释和添加反序列化器来实现。
    PeopleHandler.java

    public class PeopleHandler 
    {
       private List<Person> people;
    
       @JsonDeserialize(using = PersonDeserializer.class)
       public void setPeople(List<Person> o)
       {
          people = o;
       }
    
    }  
    

    PersonDeserializer.java

    public class PersonDeserializer extends JsonDeserializer<List<Person>>
    {
       @Override
       public List<Person> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
       {
          List<Person> retVal = new ArrayList<Person>();
          if (jp.getCurrentToken() == JsonToken.START_OBJECT)
          {
             retVal.add(jp.readValueAs(Person.class));
          }
          else if (jp.getCurrentToken() == JsonToken.START_ARRAY)
          {
             while (jp.nextToken() == JsonToken.START_OBJECT)
             {
                retVal.add(jp.readValueAs(Person.class));
             }
          }
    
          return retVal;
       }
    }
    

    【讨论】:

    • 当我收到的 json 只是一个对象时,这是否有效,例如:{people:{name:Carlos}}?
    • @cgajardo 不,仅适用于数组
    • 看,这是我的问题:(
    • 为什么没有一个人的列表?
    • 我无法控制输入,只要有一个对象,服务就会只响应该对象(而不是数组)
    【解决方案2】:

    你得到的 JSON 实际上是一个 JSON 对象的“数组”。因此,您可以尝试让 PeopleHandler 使用 ArrayList people;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      相关资源
      最近更新 更多