2011-03-09 90 views
0

我有一个表单,复选框,表单提交。 如果选中了一个,它会以字符串的形式出现,如果多个选中,它会以json数组的形式出现。杰克逊表格提交复选框

如何将对象作为数组获取?

TypeReference<HashMap> typeRef = new TypeReference<HashMap>(){}; 

    JsonFactory factory = new JsonFactory(); 
    ObjectMapper mapper = new ObjectMapper(factory); 

    HashMap<String, Object> bean = mapper.readValue(formBean, typeRef); 

bean.get("somevarible") <我想这是数组无论多少盒检查

感谢

编辑

我使用这个功能,我该怎么更新?

$.fn.serializeObject = function() { 
    var o = {}; 
    var a = this.serializeArray(); 

    $.each(a, function() { 
    if (o[this.name]) { 
     if (!o[this.name].push) { 
      o[this.name] = [o[this.name]]; 
     } 
     o[this.name].push(this.value || ''); 
    } else { 
     o[this.name] = this.value || ''; 
    } 
    }); 
    return o; 
    }; 
+1

然后你需要确保JSON总是作为一个数组到达。这是您的JSON生成问题,而不是您的JSON解析。 – skaffman 2011-03-09 17:15:27

+0

当我做bean.get,我该如何将它分配给一个数组? – john 2011-03-09 17:19:33

+0

此外,该TypeReference是不必要的或错误的:您没有定义键和值类型。所以你应该做“TypeReference >”。虽然这不是导致具体问题的原因。 – StaxMan 2011-03-09 19:15:46

回答

0

我有一个类似的问题反序列化json(又名“复选框问题”)。我的(丑陋的)解决方法是使用@JsonAnySetter手动执行传入(字符串/列表)值的“正确”事情。

// q is always just a string. 
@JsonProperty("q") 
private String query; 
// fq could be a string or a list. 
private List<String> filterQuery; 
// (get/set/add omitted) 

// XXX - this is an evil hack to support 1 or >1 fq values 
// there must be a better way to support 2-way deserialization 
@JsonAnySetter 
void addEntry(String key, Object value) 
{ 
    if ("fq".equals(key)) 
    { 
     if (value == null) 
     { 
      // can this even happen? 
     } else if (String.class.equals(value.getClass())) 
     { 
      addFilterQuery((String) value); 
     } else 
     { 
      setFilterQuery((List<String>) value); 
     } 
    } 
}