Jackson:将JSON对象序列化为多个对象

时间:2013-12-12 09:27:41

标签: java arrays json map jackson

我给了一个字符串,表示类型为Map<String, String>的json对象。一个json对象中的字符数有一个约束。如果JSON对象中的字符数超过指定的限制,我必须将json对象转换为多个json对象的Array。使用Jackson Mapper最简单,最干净的方法是什么?

例如: 如果这是给出的json对象:

{
   "cfname":"Kob",
   "NAME_6":"Philharmonic Youth Orchestra",
   "NAME_5":"Pathways to Discovery: Engineering, Medicine & CSI",
   "NAME_4":"Fashion Design Camp",
   "IMAGE_URL_1":"http://res.cloudinary.com/pxxxxxx-jxxxxxx/image/upload/c_fill,h_230,w_260/v0000000000/vccrgwdekjkpdvpsrv4f.jpg",
   "IMAGE_URL_2":"http://res.cloudinary.com/pxxxxxx-jxxxxxx/image/upload/c_fill,h_230,w_260/v0000000000/wlom2u5525nyjjbttazw.jpg"
}

如果一个json对象的字符数限制是200.那么输出将是:

[
       {
          "cfname":"Kob",
          "NAME_6":"Philharmonic Youth Orchestra",
          "NAME_5":"Pathways to Discovery: Engineering, Medicine & CSI",
          "NAME_4":"Fashion Design Camp"
       },
       {
          "IMAGE_URL_1":"http://res.cloudinary.com/pxxxxxx-jxxxxxx/image/upload/c_fill,h_230,w_260/v0000000000/vccrgwdekjkpdvpsrv4f.jpg"
       },
       {
          "IMAGE_URL_2":"http://res.cloudinary.com/pxxxxxx-jxxxxxx/image/upload/c_fill,h_230,w_260/v0000000000/wlom2u5525nyjjbttazw.jpg"
       }
]
  1. 我们可以假设给定json对象中任何键值对的长度都小于给定的字符数限制。
  2. 我们应该在计算字符时忽略空格和换行符。
  3. 用例:    我必须将这些json对象添加为电子邮件的标题。由于smtp的每个标头值的字符数限制为1000。我必须将其分解为多个json对象,每个json对象将是一个标头值。

1 个答案:

答案 0 :(得分:0)

最后我只是使用了琐碎的方法。这是我写的代码片段,对其他人有用,可以快速使用:

int                 charCount = 11 + rcpt.length();
Map<String, String> map       = Maps.newHashMap();

for (Entry<String, String> e : mergeTags.entrySet()) {
  int cnt = charCount(e);

  if (charCount + cnt >= 987) {
    message.addHeader(TEMPLATE_MERGEVARS_HEADER, BINDER.writeValue(map));
    map = Maps.newHashMap();
    charCount = 11 + rcpt.length();
  }

  map.put(e.getKey(), e.getValue());
  charCount += cnt;
}

if (!map.isEmpty()) {
  message.addHeader(TEMPLATE_MERGEVARS_HEADER, BINDER.writeValue(map));
}

private static int charCount(Entry<String, String> e) {
  return e.getKey().length() + e.getValue().length() + 6;
}

消息将包含所有标头值作为multi-map。