当我尝试将json-smart JSONObject或JSONArray作为可序列化数据传递给Intent serializable extra时,我的Android代码中有一个奇怪的问题. Json-smart是非常快速且精益的JSON解析器实现,我强烈推荐它. JSONObject扩展了HashMap< String,Object>和JSONArray扩展ArrayList< Object>只有很少的开销.这些对象的下层覆盖了Object#write或Object#read
这是问题所在:
如果我在Fragment#onSaveInstanceState(String,JSONObject)中使用这些对象,一切正常.如果我在普通Java示例项目中序列化/反序列化这些对象,它再次按预期工作.但是,如果我使用Intent#putExtra(String,JSONObject)然后尝试通过执行来获取我的JSONObject
JSONObject json = (JSONObject) intent.getSerializableExtra("JSON");
我将得到ClassCastException,因为该方法返回的是一个普通的HashMap(在JSONArray的情况下它是ArrayList).此外,如果我在map / array中查看内容,则会完全删除对JSONObject / JSONArray的任何引用,并替换为HashMaps / ArrayLists
我filed the ticket并提供了示例项目,但不幸的是,作者没有解决它关闭它,所以我只是试图找到它的底部.如果你去票,它附有简单的项目.
有没有办法解决这个问题?现在我必须将JSONObject或JSONArray转换为String并将其重新分解回对象,例如:
JSONArray feeds = (JSONArray) JSONValue.parse(intent.getStringExtra(RAW_FEED));
解决方法:
实现android.os.Parcelable:
http://developer.android.com/reference/android/os/Parcelable.html
基本上,您在对象中添加了一些额外的代码来解释如何序列化和反序列化它.这就是为什么它丢失了你的课程信息,它不知道如何正确地序列化它.如果我是你,我会通过你的意图将一个值对象传递给一个JSON对象,因为你知道你确切知道你传递的是什么类型的对象.你以这种方式检索你的Parcelable:
getIntent().getExtras().getParcelable(key);
我知道它可能看起来像一些额外的代码但我实际上认为这是一种非常干净的方式来在活动之间共享数据.您传递的是强类型,您指定如何对其进行收缩/膨胀,并且您的活动实际上不必具有彼此的任何相关知识.
在你的价值对象中,你只需填写如下空格:
/** Parcelable implementation: deserialize object
* @param in Parcel object containing the data for this object
* @return a Person object */
public Person( Parcel in ) {
String[] data = new String[2];
in.readStringArray(data);
this.firstName = data[0];
this.lastName = data[1];
}
/** Parcelable implementation code */
public int describeContents() {
return 0;
}
/** Parcelable implementation: Serialize object to be passed between activities via Intent
* @param dest The parcel to transport the object
* @param flags refer to Parcelable api
* @return nothing */
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray( new String[] {
this.firstName,
this.lastName,
});
}
希望这会有所帮助,可能只是你想要的代码,但它是一个真正干净的解决方案,因为当目标活动获得对象时,你不必担心反序列化,这意味着你的活动中更干净的代码.胖模特,干净的意见:)
标签:json,android
来源: https://codeday.me/bug/20190626/1292976.html