cloudant DB save,Not a JSON Object

                Movie movie1 = new Movie();
		movie1.setMovie_name("A");
		movie1.setMovie_year("1990");
		movie1.setPerson_name("Alec Guinness");
		
		Movie movie2 = new Movie();
		movie1.setMovie_name("B");
		movie2.setMovie_year("2010");
		movie2.setPerson_name("Alec Guinness");
		
		Movie movie3 = new Movie();
		movie1.setMovie_name("C");
		movie3.setMovie_year("1890");
		movie3.setPerson_name("Liuoge");
		
		
		List<Movie> lists = new ArrayList<Movie>();
		lists.add(movie1);
		lists.add(movie2);
		lists.add(movie3); 
                db.save(lists);

java.lang.IllegalStateException: Not a JSON Object: [{"Movie_name":"C","Movie_year":"1990","Person_name":"Alec Guinness"},{"Movie_year":"2010","Person_name":"Alec Guinness"},{"Movie_year":"1890","Person_name":"Liuoge"}]

把这段JSON代码,粘贴到http://www.bejson.com/网站校验一下,校验成功。这不是没错吗,为什么??原因是这是一个JSON Array,而不是一个JSON Object!!

JSON Array以中括号作为开头结尾,JSON Object以大括号作为开头结尾。

[
    {
        "Movie_name": "C",
        "Movie_year": "1990",
        "Person_name": "Alec Guinness"
    },
    {
        "Movie_year": "2010",
        "Person_name": "Alec Guinness"
    },
    {
        "Movie_year": "1890",
        "Person_name": "Liuoge"
    }
]


查看源码(Cloudant Database的save方法会调用底层的CouchDbClientBase类中的put方法):

/**
     * Performs a HTTP PUT request, saves or updates a document.
     *
     * @return {@link Response}
     */
    Response put(URI uri, Object object, boolean newEntity) {
        assertNotEmpty(object, "object");
        HttpResponse response = null;
        try {
            final <strong><span style="color:#cc0000;">JsonObject </span></strong>json = getGson().<strong><span style="color:#cc0000;">toJsonTree</span></strong>(object).<span style="color:#cc0000;"><strong>getAsJsonObject</strong></span>();
            String id = getAsString(json, "_id");
            String rev = getAsString(json, "_rev");
            if (newEntity) { // save
                assertNull(rev, "rev");
                id = (id == null) ? generateUUID() : id;
            } else { // update
                assertNotEmpty(id, "id");
                assertNotEmpty(rev, "rev");
            }
            final HttpPut put = new HttpPut(buildUri(uri).pathToEncode(id).buildEncoded());
            setEntity(put, json.toString());
            response = executeRequest(put);
            return getResponse(response, Response.class, getGson());
        } finally {
            close(response);
        }
    }

看到了吧,这里需要接收一个能转化为JSON Object对象,所以JSON Array就不行了。

源码可以到这里查看


solution:看来cloudant Database对象不能直接save列表,准确说是不能存储JSON Array,此时只需要写一个Wrapper类就可以了。


public class ListWrapper{
	private List<Movie> data;

	public List<Movie> getData() {
		return data;
	}

	public void setData(List<Movie> data) {
		this.data = data;
	}
	
}

然后把List放到ListWrapper中,就是一个JSON Object了,此时就可以成功save了。

ListWrapper listWrapper = new ListWrapper();
listWrapper.setData(lists);
db.save(listWrapper);


使用Wrapper方式的好处可以把整个想存储的对象存为一个data。

{
  "_id": "60db071d12aa465797b4887f02c899b5",
  "_rev": "1-9fee3602a9a99890e0727fcb67073921",
  "<strong><span style="color:#cc0000;">data</span></strong>": [
    {
      "Movie_name": "C",
      "Movie_year": "1990",
      "Person_name": "Alec Guinness"
    },
    {
<pre name="code" class="javascript">      "Movie_name": "A",
"Movie_year": "2010", "Person_name": "Alec Guinness" }, {

 
<pre name="code" class="javascript">      "Movie_name": "B",
"Movie_year": "1890", "Person_name": "Liuoge" } ]}
 

Best Practice and recommend strongly,使用Wrapper方式!




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值