meta对象写入json错误:com.cutt.zhiyue.android.api.io.exception.JsonFormaterException: com.fasterxml.jackson.databind.JsonMappingException

首先说明出现的原因:json这个东西不够智能,在解析javabean对象中的getter和setter方法时,会把两个方法命名十分相近的方法当成一个。从而形成异常。

解决办法:重新命名方法名。

同时需要注意:json在写入某一个meta对象时,会将其所关联的meta对象统统捋一遍(不一定是重置,可能仅仅是遍历一下)。

这是我们的json写入异常:

com.cutt.zhiyue.android.api.io.exception.JsonFormaterException: com.fasterxml.jackson.databind.JsonMappingException: Conflicting getter definitions for property "groupWanted": com.cutt.zhiyue.android.model.meta.order.OrderProductMeta#isGroupWanted(0 params) vs com.cutt.zhiyue.android.model.meta.order.OrderProductMeta#getGroupWanted(0 params) (through reference chain: com.cutt.zhiyue.android.model.meta.card.CardMetaAtom["article"]->com.cutt.zhiyue.android.model.meta.article.Article["creator"]->com.cutt.zhiyue.android.api.model.meta.UserInfo["product"]->java.util.ArrayList[0])

 

引起异常的部分代码:

 1     public int getGroupWanted() {
 2         return groupWanted;
 3     }
 4 
 5     public void setGroupWanted(int groupWanted) {
 6         this.groupWanted = groupWanted;
 7     }
 8 
 9     public boolean isGroupWanted() {
10         return groupWanted == 1;
11     }
getGroupWanted()和isGroupWanted()是不是很像?

发现:

今天测试提了一个bug:由a页跳转到b页,在b页跳转到c页,c页再回到b页时,b页直接销毁了,并且回到了a页。

经过debug后发现:b页中的onCreate()方法中上来就是:

1 super.onCreate(savedInstanceState);
2         if(curAtom == null){
3             notice(R.string.error_article_data);
4             return;
5         }

而引起b页直接销毁的,就是这个curAtom== null。可见curAtom这个变量一定是在父类中初始化的。我们又跳到父类中去查看发现在onCreate()方法中:

        makeAtom(savedInstanceState,intent);
 1     private void makeAtom(Bundle savedInstanceState, Intent intent) {
 2         if (savedInstanceState != null) {
 3             String atom = savedInstanceState.getString(BOUNDLE_ATOM);
 4             try {
 5                 curAtom = JsonParser.getValue(JsonObjectMapper.getObjectMapper(), atom, CardMetaAtom.class);
 6             } catch (DataParserException e) {
 7                 e.printStackTrace();
 8                 curAtom = ArticleActivityFactory.getInputAtom(intent);
 9             }
10         } else {
11             curAtom = ArticleActivityFactory.getInputAtom(intent);
12         }
13     }

 

这个方法很简单,我就不解释了。经过debug发现savedInstanceState虽然不为空,但从里面取不到值。那我们就需要看看为什么它取不到值,是不是根本就没存上。

于是来到onSaveInstanceState()方法。

 1     @Override
 2     protected void onSaveInstanceState(Bundle outState) {
 3         try {
 4             String atom = JsonWriter.writeValue(curAtom);
 5             outState.putString(BOUNDLE_ATOM, atom);
 6         } catch (JsonFormaterException e) {
 7             e.printStackTrace();
 8         }
 9         super.onSaveInstanceState(outState);
10     }

还是经过debug发现curAtom这个变量根本没有写上,原因就是文章开篇报的那个json异常。

posted @ 2015-09-25 17:12  404map  Views(648)  Comments(0Edit  收藏  举报