Jackson使用指南

Jackson使用規(guī)范以及代碼示例

依賴包

Maven依賴:

org.codehaus.jackson

jackson-mapper-asl

1.9.9

不同API規(guī)范以及示例

Data Binding API使用

Java對(duì)象轉(zhuǎn)json

Java對(duì)象轉(zhuǎn)json時(shí)對(duì)象私有屬性必須具有屬性的get/set方法,如果沒(méi)有g(shù)et方法將不能被序列化,并且get方法需要是默認(rèn)的get方法持偏,序列化后的json字符中的鍵值對(duì)中的鍵為Java對(duì)象的屬性名饺窿,Java屬性可以定義為共有和私有,如果Java對(duì)象屬性為公有的話此屬性可以沒(méi)有g(shù)et/set方法具體使用示例如下:

User? user = new User();

user.setAdress("南京市");

user.setId(27);

user.setName("張小明");

ObjectMapper? mapper = new ObjectMapper();

String? json = mapper.writeValueAsString(user);

System.out.println("序列化后:" + json);

User對(duì)象:

class User {

private? String name;

private? int id;

private? String adress;

public? void setName(String name) {

this.name? = name;

}

public? void setId(int id) {

this.id? = id;

}

public? void setAdress(String adress) {

this.adress? = adress;

}

public? String getName() {

return? name;

}

public? int getId() {

return? id;

}

public? String getAdress() {

return? adress;

}

}

Json轉(zhuǎn)java對(duì)象

ObjectMapper? mapper = new ObjectMapper();

User? us = mapper.readValue(json, User.class);

System.out.println("反序列化后:"+us.getName()+us.getAdress()+us.getId());

Java對(duì)象轉(zhuǎn)json過(guò)濾對(duì)象屬性

使用注解@JsonIgnore過(guò)濾具體屬性

對(duì)于一個(gè)Java對(duì)象绘梦,對(duì)其序列化時(shí)我們可以選擇想要序列化的屬性寝衫,對(duì)于不想序列化的屬性稀拐,我們可以選擇不進(jìn)行序列化具體我們可以使用注解@JsonIgnore標(biāo)注不需要序列化的屬性的get方法握截,具體使用如下:比如不想序列化User的name

class User {

private? String name;

private? int id;

private? Adress adress;

public? void setName(String name) {

this.name? = name;

}

public? void setId(int id) {

this.id? = id;

}

@JsonIgnore

public? String getName() {

return? name;

}

public? int getId() {

return? id;

}

public? Adress getAdress() {

return? adress;

}

public? void setAdress(Adress adress) {

this.adress? = adress;

}

}

使用注解@JsonIgnoreProperties過(guò)濾多個(gè)屬性

如果需要同時(shí)有多個(gè)屬性不需要序列化我們可以在類上進(jìn)行注解指定多個(gè)屬性不進(jìn)行序列化,具體使用注解:@JsonIgnoreProperties({"id","name"})烂叔,具體示例代碼如下:

@JsonIgnoreProperties({"id","name"})

class User {

private? String name;

private? int id;

private? Adress adress;

public? void setName(String name) {

this.name? = name;

}

public? void setId(int id) {

this.id? = id;

}

public? String getName() {

return? name;

}

public? int getId() {

return? id;

}

public? Adress getAdress() {

return? adress;

}

public? void setAdress(Adress adress) {

this.adress? = adress;

}

}

使用FilterView過(guò)濾屬性

我們也可以使用自定義FilterView并且使用其注解要序列化的屬性谨胞,首先需要定義一個(gè)需要輸出的屬性的View:FilterView.Output,然后在需要輸出屬性上聲明該View蒜鸡,之后使用writerWithView(FilterView.Output.class)來(lái)序列化就可以了胯努。需要注意的是牢裳,在這里需要把DEFAULT_VIEW_INCLUSION設(shè)置為false,因?yàn)槟J(rèn)是會(huì)輸出沒(méi)有JsonView注解的屬性的叶沛。

public class JsonViewDemo {

private? static class User {

private? long id;

@JsonView({? FilterView.Output.class })

private? String name;

@JsonView({? FilterView.Output.class })

private? String address;

public? long getId() {

return? id;

}

public? String getName() {

return? name;

}

public? String getAddress() {

return? address;

}

}

private? static class FilterView {

static? class Output {

}

}

public? static void main(String[] args) throws Exception {

User? user = new User();

user.id? = 1000L;

user.name? = "張小明";

user.address? = "南京市";

ObjectMapper? mapper = new ObjectMapper();

mapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION,false);

System.out.println(mapper.writerWithView(FilterView.Output.class).writeValueAsString(user));

}

}

其實(shí)View的作用遠(yuǎn)不止如此蒲讯,再來(lái)看一個(gè)更實(shí)用的例子:假設(shè)現(xiàn)有個(gè)API接口,需要針對(duì)不同的客戶端(ios,android)輸出不同的屬性灰署,通過(guò)創(chuàng)建多個(gè)View就能輕松完成判帮,具體使用示例如下:

public? class JsonApiViewDemo {

private? static class User {

private? long id;

@JsonView({ApiView.Default.class})

private? String name;

@JsonView({ApiView.Ios.class})

private? String avator240;

@JsonView({ApiView.Android.class})

private? String avator160;

private? String address;

public? long getId() {

return? id;

}

public? String getName() {

return? name;

}

public? String getAddress() {

return? address;

}

public? String getAvator240() {

return? avator240;

}

public? String getAvator160() {

return? avator160;

}

}

private? static class ApiView {

static? class Default {}

static? class Ios extends Default {}

static? class Android extends Default {}

}

public? static void main(String[] args) throws Exception {

ObjectMapper? mapper = new ObjectMapper();

mapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION,? false);

User? user = new User();

user.id? = 10000L;

user.name

= "張小明";

user.avator240? = "240.jpg";

user.avator160? = "160.jpg";

user.address

= "南京市";

String? apiViewJson =? mapper.writerWithView(ApiView.Default.class).writeValueAsString(user);

String? iosViewJson = mapper.writerWithView(ApiView.Ios.class).writeValueAsString(user);

String? androidViewJson =? mapper.writerWithView(ApiView.Android.class).writeValueAsString(user);

System.out.println(apiViewJson);

System.out.println(iosViewJson);

System.out.println(androidViewJson);

}

}

不修改源碼通過(guò)自定義類過(guò)濾屬性

在不需要修改源碼的情況下我們可以使用另外一種方式進(jìn)行屬性序列化的過(guò)濾,我們可以定義一個(gè)類MixIn來(lái)設(shè)置屬性過(guò)濾條件溉箕,具體使用如下:

public class JsonMixInDemo {

static? class User {

private long id;

private String name;

private String avator240;

private String avator160;

private String address;

public long getId() {

return id;

}

public String getName() {

return name;

}

public String getAddress() {

return address;

}

}

abstract class MixIn {

@JsonIgnore abstract int getAddress();

@JsonIgnore long id;

@JsonProperty("custom_name") abstract String getName();

@JsonProperty("avator") String avator240;

}

public static void main(String[] args) throws Exception {

ObjectMapper mapper = new ObjectMapper();

User user = new User();

user.id = 1234567L;

user.name = "張小明";

user.avator240 = "240.jpg";

user.avator160 = "160.jpg";

user.address = "南京市";

mapper.getSerializationConfig().addMixInAnnotations(User.class,? MixIn.class);

String json = mapper.writeValueAsString(user);

System.out.println(json);

}

}

JSON Filter與MixIn結(jié)合實(shí)現(xiàn)動(dòng)態(tài)過(guò)濾

對(duì)于使用MixIn只能實(shí)現(xiàn)靜態(tài)過(guò)濾晦墙,我們可以使用json filter與MixIn結(jié)合實(shí)現(xiàn)動(dòng)態(tài)過(guò)濾,可以動(dòng)態(tài)指定需要序列化的屬性肴茄,具體使用示例如下:

public class JsonFilterDemo {

private? static class User {

private long id;

private String name;

private String avator240;

private String avator160;

private String address;

public String getName() {

return name;

}

public String getAddress() {

return address;

}

public String getAvator240() {

return avator240;

}

public String getAvator160() {

return avator160;

}

public long getId() {

return id;

}

}

@JsonFilter("userFilter")

private static interface UserFilterMixIn

{

}

public? static void main(String[] args) throws Exception {

ObjectMapper? mapper = new ObjectMapper();

User? user = new User();

user.id? = 1000L;

user.name? = "張小明";

user.avator240? = "240.jpg";

user.avator160? = "160.jpg";

user.address? = "南京市";

FilterProvider? idFilterProvider = new? SimpleFilterProvider().addFilter("userFilter",

SimpleBeanPropertyFilter.filterOutAllExcept(new? String[] {"name", "avator240" ,"address"}));

mapper.setFilters(idFilterProvider);

mapper.getSerializationConfig().addMixInAnnotations(User.class,

UserFilterMixIn.class);

String? userFilterJson = mapper.writeValueAsString(user);

System.out.println(userFilterJson);

}

}

嵌套Java對(duì)象轉(zhuǎn)json

對(duì)于一些嵌套對(duì)象進(jìn)行序列化為json晌畅,比如User的其中一個(gè)屬性Adress為一個(gè)Java對(duì)象,Adress擁有一些屬性寡痰,則對(duì)這種嵌套對(duì)象序列化時(shí)需要注意Adress對(duì)象也要擁有g(shù)et/set方法抗楔,否則不能進(jìn)行序列化,序列化示例如下:

User? user = new User();

Adress? adress = new Adress();

adress.setPostnum(464435);

adress.setSheng("江蘇省");

adress.setXian("江寧");

user.setAdress(adress);

user.setId(27);

user.setName("張小明");

ObjectMapper? mapper = new ObjectMapper();

String? json = mapper.writeValueAsString(user);

System.out.println("序列化后:" + json);

同樣拦坠,Java對(duì)象的屬性中含有ArrayList或是HashMap的情況下也可以進(jìn)行序列化连躏,具體使用使用示例如下:

User? user = new User();

user.setId(27);

user.setName("張小明");

//user.setAdress("南京市");

Adress? adress = new Adress();

adress.setPostnum(464435);

adress.setSheng("江蘇省");

adress.setXian("江寧");

user.setAdress(adress);

ArrayList? phoneList = new ArrayList();

phoneList.add("156333568956");

phoneList.add("10086");

user.setList(phoneList);

HashMap? map = new HashMap();

map.put("phone",? "10086");

user.setMap(map);

ObjectMapper? mapper = new ObjectMapper();

String? json = mapper.writeValueAsString(user);

System.out.println("序列化后:" + json);

Json轉(zhuǎn)嵌套Java對(duì)象

Json可以直接轉(zhuǎn)為嵌套Java對(duì)象,具體使用示例如下:

ObjectMapper? mapper = new ObjectMapper();

User? us = mapper.readValue(json, User.class);

System.out.println("反序列化后:"+us.getName()+""+us.getAdress().getPostnum()+""+us.getId());

Json轉(zhuǎn)為帶有ArrayList或是HashMap的Java對(duì)象同樣可以反序列化贪婉,具體使用示例如下:

ObjectMapper? mapper = new ObjectMapper();

User? us = mapper.readValue(json, User.class);

System.out.println("反序列化后:"+us.getName()+""+us.getAdress().getPostnum()+""+us.getId()+""+us.getList()+""+us.getMap().get("phone"));

Map轉(zhuǎn)json

Map轉(zhuǎn)json是map的value可以指定類型也可以直接定義為object反粥,注意:如果在map中放入自定義對(duì)象比如User是將User序列化為字符串,在反序列化的時(shí)候不能講設(shè)置的user對(duì)象反序列化疲迂。

Map map = new HashMap();

map.put("name",

"張小明");

map.put("id",? 27);

map.put("address",

"南京市");

ObjectMapper? mapper = new ObjectMapper();

String? json = mapper.writeValueAsString(map);

System.out.println("序列化后:" + json);

Json轉(zhuǎn)map

在上面map轉(zhuǎn)json時(shí)如果將map的value設(shè)置為object時(shí)在設(shè)置value時(shí)任意指定value類型的情況下將json轉(zhuǎn)map時(shí)可以將value指定類型才顿。

Map map = new HashMap();

ObjectMapper? mapper = new ObjectMapper();

map =? mapper.readValue(json, HashMap.class);

System.out.println("反序列化后:" + map);

List轉(zhuǎn)json

ArrayList轉(zhuǎn)json時(shí)list中的add的對(duì)象可以指定具體類型也可以直接設(shè)置為Object,都可以進(jìn)行序列化尤蒿,注意:如果在list中放入自定義對(duì)象比如User是將User序列化為字符串郑气,在反序列化的時(shí)候不能講設(shè)置的user對(duì)象反序列化。

ArrayList? list = new ArrayList();

list.add("張小明");

list.add(27);

ObjectMapper? mapper = new ObjectMapper();

String? json = mapper.writeValueAsString(list);

System.out.println("序列化后:" + json);

Json轉(zhuǎn)list

在將Arraylist序列化為json時(shí)list中的對(duì)象設(shè)置為不同類型的情況下將json反序列化是可以將List中的對(duì)象類型設(shè)置為指定類型腰池,比如設(shè)置為String尾组。

ArrayList? list = new ArrayList();

ObjectMapper? mapper = new ObjectMapper();

list =? mapper.readValue(json, ArrayList.class);

System.out.println("反序列化后:" + list);

Map、List中有Java對(duì)象轉(zhuǎn)為json

Map示弓、list中可以添加普通String對(duì)象以及自定義的Java對(duì)象讳侨,序列化json的使用示例如下:

User? user = new User();

user.setId(27);

user.setName("張小明");

ArrayList? list = new ArrayList();

list.add("張小明");

list.add(27);

list.add(user);

ObjectMapper? mapper = new ObjectMapper();

String? json = mapper.writeValueAsString(list);

System.out.println("序列化后:" + json);

Json轉(zhuǎn)為內(nèi)有Java對(duì)象的Map、List

當(dāng)json是有負(fù)責(zé)的map對(duì)象序列化的情況下奏属,比如map中有普通String對(duì)象和自定義Java對(duì)象的情況下需要將json反序列化跨跨,此時(shí)需要設(shè)置反序列化后的類型為:ArrayList>,具體使用示例如下:

ObjectMapper? mapper = new ObjectMapper();

User? user = new User();

ArrayList> list = mapper.readValue(json, ArrayList.class);

user.setName(list.get(2).get("name").toString());

Array數(shù)組轉(zhuǎn)json

數(shù)組序列化為json,比如字符數(shù)組或是int數(shù)組序列化為json時(shí)具體使用示例如下:

int[]? num = new int[]{1,5};

ObjectMapper? mapper = new ObjectMapper();

String? json = mapper.writeValueAsString(num);

System.out.println("序列化后:" + json);

Json轉(zhuǎn)array

在將json反序列為數(shù)組時(shí)勇婴,定義數(shù)組大小可以不等于序列化為json之前的數(shù)組大小忱嘹,具體使用示例如下:

int[]? num = new int[3];

ObjectMapper? mapper = new ObjectMapper();

num =? mapper.readValue(json, int[].class);

System.out.println("反序列化后:" + num[1]);

使用Tree Model API進(jìn)行反序列化

接下來(lái)看一下反序列化,現(xiàn)在很多網(wǎng)站都開(kāi)放了api接口耕渴,支持json格式的返回拘悦。比如在調(diào)用了某個(gè)api后,需要解析返回的json數(shù)據(jù)獲取信息橱脸,這種情況下為json創(chuàng)建一個(gè)對(duì)應(yīng)的類是很不方便的础米。此時(shí)使用Tree Model來(lái)解析json就比較方便了。

ObjectMapper mapper = new? ObjectMapper();

File file = new? File("c:/test.txt");

JsonNode rootNode = mapper.readValue(file,? JsonNode.class);

String name =? rootNode.get("name").getTextValue();

String adress =? rootNode.get("adress").getTextValue();

System.out.println(name+""+adress);

可以解析文件或是URL或是InputStream慰技。

具體文本內(nèi)容示例:

{

"name" : "張小明",

"adress" : "南京市"

}

也可以使用另外一種方式椭盏,具體代碼示例如下:

File file = new? File("c:/test.txt");

JsonParser jp =? mapper.getJsonFactory().createJsonParser(file);

JsonNode rootNode =? mapper.readTree(jp);

String name =? rootNode.get("name").getTextValue();

String adress = rootNode.get("adress").getTextValue();

System.out.println(name+""+adress);

使用Streaming API生產(chǎn)json格式內(nèi)容到文件或OutputStream

如果我們希望創(chuàng)建json格式的內(nèi)容并且將其寫入文件或是字節(jié)流的話可以使用Streaming API輕松創(chuàng)建json格式的內(nèi)容并將其寫到文件或是字節(jié)流、URL中吻商。具體使用示例如下:

JsonFactory? f = new JsonFactory();

JsonGenerator? g = null;

//OutputStream out =? null;

//g =? f.createJsonGenerator(out, JsonEncoding.UTF8);

g =? f.createJsonGenerator(new File("c:/user.json"), JsonEncoding.UTF8);

g.writeStartObject();

g.writeObjectFieldStart("name");

g.writeStringField("first",? "Joe");

g.writeStringField("last",? "Sixpack");

g.writeEndObject();

g.writeStringField("gender",? "MALE");

g.writeBooleanField("verified",? false);

g.writeFieldName("userImage");

byte[]? binaryData = new byte[]{22,33,44};

g.writeBinary(binaryData);

g.writeEndObject();

g.close();

最后列一些使用Jackson的最佳實(shí)踐:

[if !supportLists]·[endif]重用重量級(jí)對(duì)象: ObjectMapper, JsonFactory

[if !supportLists]·[endif]序列化性能(從高到低):OutputStream > Writer > writeValueAsString

[if !supportLists]·[endif]反序列化性能(從高到低):byte[] > InputStream > Reader

[if !supportLists]·[endif]用更輕量ObjectReader/ObjectWriter替代ObjectMapper

[if !supportLists]·[endif]及時(shí)關(guān)閉JsonParser, JsonGenerator


本文是自己研究jackson使用時(shí)整理的掏颊,有些內(nèi)容是網(wǎng)上查詢的!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末艾帐,一起剝皮案震驚了整個(gè)濱河市乌叶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柒爸,老刑警劉巖准浴,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捎稚,居然都是意外死亡乐横,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門今野,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)葡公,“玉大人,你說(shuō)我怎么就攤上這事条霜〈呤玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宰睡,是天一觀的道長(zhǎng)蒲凶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拆内,這世上最難降的妖魔是什么旋圆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮麸恍,結(jié)果婚禮上灵巧,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好孩等,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著采够,像睡著了一般肄方。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹬癌,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天权她,我揣著相機(jī)與錄音,去河邊找鬼逝薪。 笑死隅要,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的董济。 我是一名探鬼主播步清,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虏肾!你這毒婦竟也來(lái)了廓啊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤封豪,失蹤者是張志新(化名)和其女友劉穎谴轮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吹埠,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡第步,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缘琅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘都。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胯杭,靈堂內(nèi)的尸體忽然破棺而出驯杜,到底是詐尸還是另有隱情,我是刑警寧澤做个,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布鸽心,位于F島的核電站,受9級(jí)特大地震影響居暖,放射性物質(zhì)發(fā)生泄漏顽频。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一太闺、第九天 我趴在偏房一處隱蔽的房頂上張望糯景。 院中可真熱鬧,春花似錦、人聲如沸蟀淮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怠惶。三九已至涨缚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間策治,已是汗流浹背脓魏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留通惫,地道東北人茂翔。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像履腋,于是被迫代替她去往敵國(guó)和親珊燎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理府树,服務(wù)發(fā)現(xiàn)俐末,斷路器,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 1.概述2.Gson的目標(biāo)3.Gson的性能和擴(kuò)展性4.Gson的使用者5.如何使用Gson 通過(guò)Maven來(lái)使用...
    人失格閱讀 14,231評(píng)論 2 18
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法奄侠,類相關(guān)的語(yǔ)法卓箫,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法垄潮,異常的語(yǔ)法烹卒,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,623評(píng)論 18 399
  • 昨天有朋友讓我?guī)兔o她的公眾號(hào)畫配圖。她是做職業(yè)顧問(wèn)的弯洗,因?yàn)樵谕馄蠊ぷ鬟^(guò)旅急,有一些人脈。現(xiàn)在多數(shù)是給外企做相關(guān)的HR...
    溫迪畫畫閱讀 831評(píng)論 13 8