JSON數(shù)據(jù)解析

JSON的特點(diǎn):

1、JSON比XML的數(shù)據(jù)傳遞的有效性高;2、JSON完全獨(dú)立于編程語言;3、JSON的本質(zhì)是具有特定格式的字符串;4、易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。

JSON數(shù)據(jù)格式(JSON對(duì)象、JSON數(shù)組):

1、JSON對(duì)象:{ }

結(jié)構(gòu):{key1:value1,key2:value2,key3:value3}

key的數(shù)據(jù)類型:字符串

value的數(shù)據(jù)類型:字符串、數(shù)值、null、JSON對(duì)象、JSON數(shù)組

例子:

{" name ":" luoweichao "," blogUrl ":" luoweichao.top "}

//以key/value鍵值對(duì)形式構(gòu)建的,正確

{" name ":" luoweichao "," luoweichao.top "}

//沒有以key/value鍵值對(duì)形式構(gòu)建的,錯(cuò)誤

2、JSON數(shù)組:[ ]

結(jié)構(gòu):[value1,value2,value3]

value的數(shù)據(jù)類型:字符串、數(shù)值、null、JSON對(duì)象、JSON數(shù)組

例子:

[" 1 "," csdn ", {" name ":" luoweichao "," blogUrl ":" luoweichao.top "}? ]

//正確

[" 1 "," name ":" luoweichao "]//錯(cuò)誤

JSON解析方向:

1、將Java對(duì)象(包括集合)轉(zhuǎn)換成JSON格式字符串;(服務(wù)端)

2、將JSON格式字符串轉(zhuǎn)換成Java對(duì)象(包括集合)。(客戶端)

3、JSON和Java之間的轉(zhuǎn)換關(guān)系:JSON中的對(duì)象對(duì)應(yīng)著Java中的對(duì)象;JSON中的數(shù)組對(duì)應(yīng)這Java中的集合。

Android原生技術(shù)解析JSON:特點(diǎn):很麻煩,對(duì)于復(fù)雜的json數(shù)據(jù)解析很容易出錯(cuò)!(不推薦使用)

1、解析JSON對(duì)象的API:JsonObjectJSONObject(String json);將Json字符串解析成Json對(duì)象;XxxgetXxx(String name) ;根據(jù)name在json對(duì)象中得到相應(yīng)的value。示例代碼:(1)獲取或創(chuàng)建JSON數(shù)據(jù)(為了方便,這里就直接創(chuàng)建了):

[java]view plaincopy

String json = "{\n" +"\t"id":2, "name":"金魚", \n" +"\t"price":12.3, \n" +"\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +"}\n";

ShopInfo shopInfo = null;

(2)解析Json對(duì)象:

[java]view plaincopy

try{JSONObject jsonObject =newJSONObject(json);// int id = jsonObject.getInt("id");int id1 = jsonObject.optInt("id");Stringname = jsonObject.optString("name"); double price = jsonObject.optDouble("price");StringimagePath = jsonObject.optString("imagePath");// 封裝Java對(duì)象? shopInfo = new ShopInfo(id1, name, price, imagePath); } catch (JSONException e) { e.printStackTrace(); }

注意:這里記得要加try_catch異常處理。(3)創(chuàng)建JavaBean類,并顯示解析后的數(shù)據(jù):

[java]view plaincopy

tv_native_last.setText(shopInfo.toString());

2、解析Json數(shù)組的API:JSONArrayJSONArray(String json);將json字符串解析成json數(shù)組;int length();得到j(luò)son數(shù)組中元素的個(gè)數(shù);XxxgetXxx(int s) ;根據(jù)下標(biāo)得到j(luò)son數(shù)組中對(duì)應(yīng)的元素?cái)?shù)據(jù)。示例代碼:(1)獲取或創(chuàng)建JSON數(shù)據(jù):

[java]view plaincopy

String json = "[\n" +" {\n" +" "id": 1,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg",\n" +" "name": "金魚1",\n" +" "price": 12.3\n" +" },\n" +" {\n" +" "id": 2,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg",\n" +" "name": "金魚2",\n" +" "price": 12.5\n" +" }\n" +"]";

(2)解析json數(shù)組:

[java]view plaincopy

try{JSONArray jsonArray =newJSONArray(json);for(inti =0; i < jsonArray.length(); i++) {? JSONObject jsonObject = jsonArray.getJSONObject(i);if(jsonObject !=null) {intid = jsonObject.optInt("id");? String name = jsonObject.optString("name");doubleprice = jsonObject.optDouble("price");? String imagePath = jsonObject.optString("imagePath");// 封裝Java對(duì)象 ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);? shops.add(shopInfo);? } } } catch (JSONException e) { e.printStackTrace();? }

(3)顯示解析后的數(shù)據(jù):

[java]view plaincopy

tv_native_last.setText(shops.toString());

到此為止,這就是用原生的技術(shù)去解析json了,至于復(fù)雜特殊的json數(shù)據(jù)怎樣去解析,也是大同小異了,一層一層解析就對(duì)了!

用Gson框架技術(shù)解析JSON:特點(diǎn):解析沒那么麻煩,代碼量簡潔,可以很方便地解析復(fù)雜的Json數(shù)據(jù),而且谷歌官方也推薦使用。先放出jar包的下載地址:https://mvnrepository.com/artifact/com.google.code.gson/gson

如過用Android Studio做開發(fā)的話,可以通過Gradle,直接添加依賴,不用下載jar包,很方便,如下:

1、用Gson解析JSON對(duì)象:(1)將gson的jar包導(dǎo)入到項(xiàng)目libs目錄下,或者直接通過Gradle添加依賴:

[java]view plaincopy

compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'

(2)創(chuàng)建Gson對(duì)象:[java]view plaincopy

Gson gson = new Gson();

(3)通過創(chuàng)建的Gson對(duì)象調(diào)用fromJson()方法,返回該json數(shù)據(jù)對(duì)象的Java對(duì)象;

[java]view plaincopy

ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);

注意要記得創(chuàng)建對(duì)象的JavaBean類;要求json對(duì)象中的key的名稱與Java對(duì)象的JavaBean類中的屬性名要相同,否則解析不成功!示例代碼如下:[java]view plaincopy

// 1 獲取或創(chuàng)建JSON數(shù)據(jù)String json = "{\n" +"\t"id":2, "name":"金魚", \n" +"\t"price":12.3, \n" +"\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +"}\n";

// 2 解析JSON數(shù)據(jù)? Gson gson = new Gson(); ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class); // 3 展示數(shù)據(jù)? tv_gson_last.setText(shopInfo.toString());

2、用Gson解析JSON數(shù)組:(1)(2)與上面相同,要用Gson就要先添加依賴,然后創(chuàng)建Gson對(duì)象;(3)通過創(chuàng)建的Gson對(duì)象調(diào)用fromJson()方法,返回該json數(shù)據(jù)對(duì)應(yīng)的Java集合。這里但強(qiáng)調(diào)一下:要記得創(chuàng)建對(duì)象的JavaBean類;要求json對(duì)象中的key的名稱與Java對(duì)象的JavaBean類中的屬性名要相同,否則解析不成功!

示例代碼如下:

[java]view plaincopy

// 1 獲取或創(chuàng)建JSON數(shù)據(jù)String json = "[\n" +" {\n" +" "id": 1,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg",\n" +" "name": "金魚1",\n" +" "price": 12.3\n" +" },\n" +" {\n" +" "id": 2,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg",\n" +" "name": "金魚2",\n" +" "price": 12.5\n" +" }\n" +"]";

// 2 解析JSON數(shù)據(jù)? Gson gson = new Gson(); List shops = gson.fromJson(json, new TypeToken>() { }.getType()); // 3 展示數(shù)據(jù)? tv_gson_last.setText(shops.toString());

還是那句話,復(fù)雜特殊的都是大同小異,理解了方法就沒問題了!3、Gson還可以將Java對(duì)象、Java對(duì)象的List 轉(zhuǎn)換為json字符串{};有興趣的就去研究一下哈。

用Fastjson框架技術(shù)解析JSON:特點(diǎn):Fastjson是用Java語言編寫的高性能功能完善的JSON庫。它采用了一種“假定有序、快速匹配”的算法,把JSON Parse的性能提升到極致,是目前Java語言中最快的JSON庫。Fastjson是阿里巴巴開源框架,已經(jīng)開源到github上了,地址為:https://github.com/alibaba/fastjson

在github上,我還專門留意了這個(gè),哈哈,gson和fastjson比起來,gson就是“烏龜”

要使用Fastjson,也是想Gson一樣,先導(dǎo)入jar包,或者在Gradle中添加依賴:

[java]view plaincopy

compile 'com.alibaba:fastjson:1.1.55.android'

添加好依賴后就可以使用Fastjson了!1、用Fastjson解析JSON對(duì)象:利用Fastjson的JSON調(diào)用parseObject()方法,獲取轉(zhuǎn)換后的Java對(duì)象。注意要記得創(chuàng)建對(duì)象的JavaBean類;要求json對(duì)象中的key的名稱與Java對(duì)象的JavaBean類中的屬性名要相同,否則解析不成功!示例代碼:

[java]view plaincopy

// 1 獲取或創(chuàng)建json數(shù)據(jù)String json = "{\n" +"\t"id":2, "name":"金魚", \n" +"\t"price":12.3, \n" +"\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +"}\n";

// 2 解析JSON數(shù)據(jù)? ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class); // 3 顯示數(shù)據(jù)? tv_fastjson_last.setText(shopInfo.toString());

2.用Fastjson解析JSON數(shù)組:利用Fastjson的JSON調(diào)用parseArray()方法,獲取轉(zhuǎn)換后的Java集合。這里但強(qiáng)調(diào)一下:要記得創(chuàng)建對(duì)象的JavaBean類;要求json對(duì)象中的key的名稱與Java對(duì)象的JavaBean類中的屬性名要相同,否則解析不成功!示例代碼:

[java]view plaincopy

// 1 獲取或創(chuàng)建json數(shù)據(jù)String json = "[\n" +" {\n" +" "id": 1,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg",\n" +" "name": "金魚1",\n" +" "price": 12.3\n" +" },\n" +" {\n" +" "id": 2,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg",\n" +" "name": "金魚2",\n" +" "price": 12.5\n" +" }\n" +"]";

// 2 解析JSON數(shù)據(jù)? List shopInfos = JSON.parseArray(json, ShopInfo.class); // 3 顯示數(shù)據(jù)? tv_fastjson_last.setText(shopInfos.toString());

3、同樣Fastjson也可以將Java對(duì)象、Java對(duì)象的List 轉(zhuǎn)換為json字符串{};有興趣的就去研究一下哈。到此為止,算是比較詳細(xì)地介紹了json解析了。

前言:

最近為了統(tǒng)一項(xiàng)目中使用的框架,發(fā)現(xiàn)項(xiàng)目中用到了兩種json解析框架,他們就是當(dāng)今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,為了廢除其中一個(gè)所以來個(gè)性能和使用的大比拼。

FastJson簡介:Fastjson是一個(gè)Java語言編寫的JSON處理器,由阿里巴巴公司開發(fā)。

當(dāng)前版本: fastjson-1.2.14.jar

下載地址http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.14/

對(duì)象轉(zhuǎn)化成json:

/**

* 對(duì)象轉(zhuǎn)化為json fastjson 使用方式

*

* @return

*/publicstaticStringobjectToJsonForFastJson(Objectobject) {if(object ==null) {return"";? ? }try{returnJSON.toJSONString(object);? ? }catch(JSONException e) {? ? }catch(Exception e) {? ? }return"";}

json轉(zhuǎn)化成對(duì)象:

/**

* json轉(zhuǎn)化為對(duì)象? fastjson 使用方式

*

* @return

*/

public static T jsonToObjectForFastJson(String jsonData, Class clazz) {

if (TextUtils.isEmpty(jsonData)) {

return null;

}

try {

return parseObject(jsonData, clazz);

} catch (Exception e) {

}

return null;

}

json轉(zhuǎn)化成List:

/**

*json轉(zhuǎn)化為List? fastjson 使用方式

*/

public static List jsonToListForFastJson(String jsonData) {

if (TextUtils.isEmpty(jsonData)) {

return null;

}

List arrayList = null;

try {

arrayList =? parseObject(jsonData,new TypeReference(){});

} catch (Exception e) {

}

return arrayList;

}

json轉(zhuǎn)化這Map:

/**

*json轉(zhuǎn)化為Map? fastjson 使用方式

*/publicstaticMapjsonToMapForFastJson(StringjsonData){if(TextUtils.isEmpty(jsonData)) {returnnull;? ? }Mapmap =null;try{? ? ? ? map =? parseObject(jsonData,newTypeReference(){});? ? }catch(Exception e){? ? ? ? e.printStackTrace();? ? }returnmap;}

Gson 簡介:Gson由谷歌研發(fā),可以把Java對(duì)象轉(zhuǎn)換成JSON,也可以把JSON字符串轉(zhuǎn)換成一個(gè)相等的Java對(duì)象。Gson支持任意復(fù)雜Java對(duì)象包括沒有源代碼的對(duì)象。

當(dāng)前版本2.40

使用方式? build.gradle 中配置 compile 'com.google.code.gson:gson:2.4'

對(duì)象轉(zhuǎn)化json:

/**

* 對(duì)象轉(zhuǎn)化為json對(duì)象? Gson 使用方式

*

* @return

*/

public static String objectToJsonForGson(Object object) {

if (object == null) {

return "";

}

Gson gson;

try {

gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

return gson.toJson(object);

} catch (Exception e) {

e.printStackTrace();

}

return "";

}

json轉(zhuǎn)化成對(duì)象:

/**

* json轉(zhuǎn)化為對(duì)象? Gson 使用方式

*

* @return

*/

publicstatic T jsonToObjectForGson(String jsonData,Classclazz){if(TextUtils.isEmpty(jsonData)) {returnnull;? ? }? ? T finalResult =null;try{? ? ? ? Gson gson =newGsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();? ? ? ? finalResult = gson.fromJson(jsonData, clazz);? ? }catch(Exceptione) {? ? ? ? e.printStackTrace();? ? }returnfinalResult;}

json轉(zhuǎn)化成List:

/**

*json轉(zhuǎn)化為集合? Gson 使用方式

*/

public static List jsonToListForForGson(String jsonData) {

if (TextUtils.isEmpty(jsonData)) {

return null;

}

List list = null;

try {

Type listType = new TypeToken() {

}.getType();

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

list = gson.fromJson(jsonData, listType);

} catch (Exception e) {

}

return list;

}

json轉(zhuǎn)化為Map:

/**

*json轉(zhuǎn)化為Map? fastjson 使用方式

*/

public static Map jsonToMapForForGson(String jsonData){

if (TextUtils.isEmpty(jsonData)) {

return null;

}

Map map = null;

try {

Type listType = new TypeToken() {

}.getType();

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

map = gson.fromJson(jsonData, listType);

} catch (Exception e) {

}

return map;

}

測試性能程序:

第一步:首先創(chuàng)建一個(gè)實(shí)體對(duì)象Person

public class Person {

privateString name;//姓名privateintage;//年齡publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age = age;}publicStringgetName(){returnname;}publicvoidsetName(String name){this.name = name;}

}

第二部:創(chuàng)建一個(gè)測試集合:

List personList=newArrayList<>();inttestMaxCount=1000;//測試的最大數(shù)據(jù)條數(shù) //添加測試數(shù)據(jù)for(inti=0;i

分別執(zhí)行兩者的轉(zhuǎn)化和解析代碼:

//FastJson生成json數(shù)據(jù)longstart=System.currentTimeMillis();? ? String jsonData=JsonUtils.objectToJsonForFastJson(personList);longend=System.currentTimeMillis();? ? Log.e("MainActivity","FastJson生成json數(shù)據(jù) cost time---->"+(end-start));//FastJson解析json數(shù)據(jù)start=System.currentTimeMillis();? ? List tempPersons=JsonUtils.jsonToListForFastJson(jsonData);? ? end=System.currentTimeMillis();? ? Log.e("MainActivity","FastJson解析json數(shù)據(jù) cost time---->"+(end-start));//Gson生成json數(shù)據(jù)start=System.currentTimeMillis();? ? jsonData=JsonUtils.objectToJsonForGson(personList);? ? end=System.currentTimeMillis();? ? Log.e("MainActivity","Gson生成json數(shù)據(jù) cost time---->"+(end-start));//Gson解析json數(shù)據(jù)start=System.currentTimeMillis();? ? List tempPersons1=JsonUtils.jsonToListForForGson(jsonData);? ? end=System.currentTimeMillis();? ? Log.e("MainActivity","Gson解析json數(shù)據(jù) cost time---->"+(end-start));

重點(diǎn)看執(zhí)行結(jié)果:單位毫秒(執(zhí)行時(shí)間)

兩者轉(zhuǎn)換性能對(duì)比:1000條? ? 10000條? 100000條? 200000條

fastJson :? ? ? ? ? 45? ? ? ? ? 289? ? ? ? 4010? ? ? ? 8396

Gson? ? :? ? ? ? ? 60? ? ? ? ? 724? ? ? ? 4071? ? ? ? 8803

兩者解析性能對(duì)比:1000條? ? 10000條? 100000條? 200000條

fastJson :? ? ? ? ? 55? ? ? ? ? 552? ? ? ? 3826? ? ? ? 8638

Gson? ? :? ? ? ? ? 45? ? ? ? ? 465? ? ? ? 5942? ? ? ? 9668

總結(jié):在數(shù)據(jù)量比較小的情況下,兩者性能相差無幾,在數(shù)據(jù)量比較大的情況下FastJson還是有優(yōu)勢的。

插曲:為了項(xiàng)目省事,本人把FastJson給刪除了,結(jié)果項(xiàng)目中遺留了一些代碼編寫不規(guī)范的情況,比如userId 寫成了useid 但是json數(shù)據(jù)中返回的是userId,之前用FastJson一直正常這才發(fā)現(xiàn)原來FastJson對(duì)實(shí)體屬性是忽略大小寫的,真是一個(gè)神奇的東西。

作者:gogoingmonkey

鏈接:http://www.lxweimin.com/p/501f7a9b4c39

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評(píng)論 3 428
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,823評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,339評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,713評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評(píng)論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,893評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,201評(píng)論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,397評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,631評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評(píng)論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,128評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,347評(píng)論 2 377

推薦閱讀更多精彩內(nèi)容