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方式!