如何使用Java Jersey处理不确定的Json

时间:2014-06-02 20:20:38

标签: java json jersey

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

{people:{name:Carlos}}

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

@XmlRootElement
class PeopleHandler(){

    public Person people;

}

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

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

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

注意:主要问题是我可以在这里收到任何一个Json String。所以我的班级必须能够支持两者。

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

2 个答案:

答案 0 :(得分: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;
   }
}

答案 1 :(得分:0)

你所拥有的JSON实际上是一个JSON对象的“数组”。因此,您可以尝试使PeopleHandler使用ArrayList&lt;人&GT;人;