如何在jackson 2中进行深度合并JSON?

时间:2016-01-25 05:44:22

标签: json jackson jackson-modules

我正在使用Jersey和Jackson2来开发Restful API。我们开发PUT方法时遇到问题。我们的PUT方法有点像PATCH方法。它只会更新请求正文中收到的属性。

我使用ObjectMapper.readerForUpdating()方法进行对象合并。但是这种方法只支持第一级合并。例如:我有一个现有的JSON对象

@Override
     public View getView(int position, View convertView, ViewGroup parent) {
         ColorItem colorItem = getItem(position);
         ViewHolder viewHolder;

         if (convertView == null) {
             viewHolder = new ViewHolder();
             LayoutInflater inflater = LayoutInflater.from(getContext());
             convertView = inflater.inflate(layoutResource, parent, false);
             viewHolder.icon = (ImageView) convertView.findViewById(R.id.imageview_icon);
             viewHolder.color = (TextView) convertView.findViewById(R.id.textview_item_name);
             convertView.setTag(viewHolder);
         } else {
             viewHolder = (ViewHolder) convertView.getTag();
         }

         viewHolder.icon.setImageResource(colorItem.getColorIconId());
         viewHolder.color.setText(colorItem.getColorName());
// need to give image for unselected state too.inplace of below line you can give below line in else part of positioin== 2 condition
convertView.setBackgroundResource(R.drawable.list_item_unSelectedImage);
         if(position == 2) {
             convertView.setBackgroundResource(R.drawable.list_item_selected);
         }


         return convertView;
     }

然后我收到一个像

的JSON对象
{
  "a": "this is a",
  "b": "this is b",
  "c": {
    "x": 1,
    "y": 2
  }
}

我希望合并的对象应该是:

{
  "a": "this is a new a",
  "c": {
    "x": 3
  }
}

但结果是

{
  "a": "this is a new a",
  "b": "this is b",
  "c": {
    "x": 3,
    "y": 2
  }
}

正确合并第一级属性。但对于深层次,它正在进行对象替换。有没有办法做深度合并?

2 个答案:

答案 0 :(得分:1)

此时,您必须通过自己遍历JSON树(JsonNode)手动执行此操作,更新属性。可能有基于杰克逊的扩展库为此提供支持,但核心杰克逊数据库只有"浅"合并单个(根JSON对象)级别。

答案 1 :(得分:-1)

我正在浏览jackson-databind(com.fasterxml.jackson.core)v 2.11的@JsonMerge文档,发现它们已经开始支持深度合并。但是我没有尝试使用它。