我正在使用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
}
}
正确合并第一级属性。但对于深层次,它正在进行对象替换。有没有办法做深度合并?
答案 0 :(得分:1)
此时,您必须通过自己遍历JSON树(JsonNode
)手动执行此操作,更新属性。可能有基于杰克逊的扩展库为此提供支持,但核心杰克逊数据库只有"浅"合并单个(根JSON对象)级别。
答案 1 :(得分:-1)
我正在浏览jackson-databind(com.fasterxml.jackson.core)v 2.11的@JsonMerge文档,发现它们已经开始支持深度合并。但是我没有尝试使用它。