我今天从一位同事那里得到了这个问题。让我们说我们得到了一个像这样的Json字符串:
{people:{name:Carlos}}
所以我有一个简单的类来处理这个Json String,它看起来像这样:
@XmlRootElement
class PeopleHandler(){
public Person people;
}
有时Json String会提供一个人员列表,如下所示:
{people:[{name:Carlos}, {name:Michel}]}
我的问题是:如何更改我的PeopleHandler类来管理这种输入,是否有任何可以帮助的注释?
注意:主要问题是我可以在这里收到任何一个Json String。所以我的班级必须能够支持两者。
注意2 :我无法控制输入,它由网络服务提供。我知道只要有一个对象,我就可以查看Json并使用列表构建一个副本,但我正在寻找更优雅的解决方案。
答案 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;人;