繁体   English   中英

json反序列化问题

[英]json deserialization problem

有一个数组,当大小为1时,我收到的json数据不包含[] ; 喜欢

{"firstname":"tom"}

当大小大于1时,我收到的数据包含[] ,如

[{"firstname":"tom"},{"firstname":"robert"}]

目前我的类包含一个数组属性

String[] firstname;
//getter setter omit here

代码处理这个喜欢

ObjectMapper mapper = new ObjectMapper();    
MyClass object = mapper.readValue(json, MyClass.class);

当大小大于1时,反序列化工作。 但是,当size为1时,反序列化失败。

我目前正在使用杰克逊,这个问题的任何解决方案?

我想知道杰克逊/ gson或任何其他图书馆是否可以处理这个问题?

特别是杰克逊,你最好的选择是首先绑定到JsonNode或Object,如:

Object raw = objectMapper.readValue(json, Object.class); // becomes Map, List, String etc

然后检查你得到了什么,再次绑定:

MyClass[] result;
if (raw instanceof List<?>) { // array
  result = objectMapper.convertValue(raw, MyClass[].class);
} else { // single object
  result = objectMapper.convertValue(raw, MyClass.class);
}

但我认为你得到的JSON很糟糕 - 为什么你会返回一个只有1号数组的对象或数组? - 所以如果可能的话,我宁愿先修好JSON。 但如果不可能,这将有效。

以下是使用GSON的方法。 让我们假设这个对象结构:

public class Group{

    public Group(final List<Person> members){
        this.members = members;
    }

    private final List<Person> members;
}

public class Person{

    public Person(final String firstName, final String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }

    private final String firstName;
    private final String lastName;
}

这是一个解串器,可以理解单个Person条目以及它们的数组:

public class GroupDeserializer implements JsonDeserializer<Group>{

    @Override
    public Group deserialize(final JsonElement json,
        final Type typeOfT,
        final JsonDeserializationContext context) throws JsonParseException{
        List<Person> members;
        if(json.isJsonArray()){
            final JsonArray array = json.getAsJsonArray();
            members = new ArrayList<Person>(array.size());
            for(final JsonElement personElement : array){
                members.add(getSinglePerson(personElement, context));
            }
        } else{
            members =
                Collections.singletonList(getSinglePerson(json, context));
        }
        return new Group(members);
    }

    private Person getSinglePerson(final JsonElement element,
        final JsonDeserializationContext context){
        final JsonObject personObject = element.getAsJsonObject();
        final String firstName =
            personObject.getAsJsonPrimitive("firstname").getAsString();
        final String lastName =
            personObject.getAsJsonPrimitive("lastname").getAsString();
        return new Person(firstName, lastName);
    }

}

在这里,您可以找到使用它的必要配置

当我尝试反序列化从XML构造的JSON对象时,我遇到了同样的问题。 (XML-JSON)。 经过相当多的研究,发现我们有一个简单的解决方案。

只需设置功能:ACCEPT_SINGLE_VALUE_AS_ARRAY。

ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,true);

欲了解更多信息: http//fasterxml.github.com/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/DeserializationFeature.html#ACCEPT_SINGLE_VALUE_AS_ARRAY

编辑:我想你只需要提取一个JsonElement并检查它是isJsonArray()和/或isJsonObject() 然后,只需调用getAsJsonArray()getAsJsonObject()

旧答案:为什么不尝试提取数组并在失败时捕获JsonParseException 在catch块中,尝试提取对象。

我知道它不漂亮但应该有效。

在第一个实例中,它看起来像一个对象,在第二个实例中,它看起来像一个对象数组(听起来像你期待的那样)。

对于这样的情况,JSON编码库通常具有“强制数组”选项。 如果失败,在您的客户端上,您可以检查JSON响应,如果它不是数组,则将返回的对象推送到新数组中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM