问题:使用Jackson将JSON转换为对象时,我的Samsung SM-T580(Android 6.0.1)将以下异常抛出。仅在OnePlus3(Android 6.0.1)或Zenpad 8.0(Android 5)上抛出例外,仅在Samsung SM-T580上。
java.lang.IllegalArgumentException: Conflicting setter definitions for property "myanmarEncoding": android.graphics.Paint#setMyanmarEncoding(1 params) vs android.graphics.Paint#setMyanmarEncoding(1 params)
at [Source: N/A; line: -1, column: -1]
映射的执行如下(Jackson版本2.8.4)。
import com.fasterxml.jackson.databind.ObjectMapper;
...
ObjectMapper objectMapper = new ObjectMapper();
try {
myObj = objectMapper.convertValue(document.getProperties(), MyClass.class);
} catch (Exception e) {
Log.e(TAG, e.getLocalizedMessage());
return;
}
方法:首先,我已将@JsonIgnoreProperties(ignoreUnknown = true)
添加到MyClass
中。然后,我尝试通过混合使用android.graphics.Paint
类上的@JsonIgnoreType
来解决问题。这有点成功,因为它防止了第一个例外。
不幸的是,另一个例外是:
java.lang.IllegalArgumentException: Conflicting setter definitions for property "content": android.widget.HoverPopupWindow#setContent(1 params) vs android.widget.HoverPopupWindow#setContent(1 params)
at [Source: N/A; line: -1, column: -1]
方法android.graphics.Paint#setMyanmarEncoding
和类android.widget.HoverPopupWindow
似乎是隐藏的Android来源的一部分。
这里发生了什么,如何解决此问题?
我通过排除Paint.class
并忽略Android隐藏的HoverPopupWindow.class
的setContent
方法来找到解决方法。相关方法参数是在HoverPopupWindow.smali(github)中定义的。
这是使用混合物的方式(在使用objectMapper.convertValue
之前):
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(android.graphics.Paint.class, IgnoreType.class);
objectMapper.addMixIn(Object.class, IgnoreMethods.class);
Mixin类的定义如下:
@JsonIgnoreType
public class IgnoreType {}
interface IgnoreMethods {
@JsonIgnore
void setContent(int resId);
@JsonIgnore
void setContent(View view);
@JsonIgnore
void setContent(View view, ViewGroup.LayoutParams lp);
@JsonIgnore
void setContent(CharSequence text);
}
不幸的是,我仍然不知道为什么映射器试图在此特定设备上实例化Paint
和HoverPopupView
类。