Äúµ±Ç°µÄλÖ㺸ֲĠ> ¸Ö½ÊÏß > ¼Û¸ñ»ã×Ü

¶þÊ®²»»ó?£¬¶þÊ®²»»ó½â˵

À´Ô´:Í·Ìõ ×÷Õß: chanong
·ÖÏíµ½
¹Ø×¢µÂÇÚ¸ÖÌúÍøÔÚÏߣº
  • ɨÃè¶þάÂë

    ¹Ø×¢¡Ì

    µÂÇÚ¸ÖÌúÍøÎ¢ÐÅ

ÔÚÏß×Éѯ£º
  • ɨÃè»òµã»÷¹Ø×¢µÂÇÚ¸ÖÌúÍøÔÚÏ߿ͷþ

×÷ÕߣºBATµÄÎÚÍаî

Ô­ÎÄÁ´½Ó£ºhttps://mp.weixin.qq.com/s/VYy1QVeFLRkciymFHueb5w

¼ò½éÔÚ±¾ÎÄÖУ¬ÎÒÃÇÐèÒª¼ÌÐøÌÖÂÛJackson µÄ¡°¸ß¼¶¡±²¿·Ö£ºÊý¾Ý°ó¶¨jackson-databind Ä£¿é¡£Í¨¹ýÉîÈëÁ˽â¸Ã¸ß¼¶API£¬Äú½«¼ÌÐø·¢ÏÖÎÒ»¨Á˺ܶàʱ¼ä½âÊ͵ÄÓмÛÖµµÄϸ½Ú²¿·Ö¡£´åÉÏ´ºÊ÷Ҳ˵¹ý£º¡°ÈËÉúûÓÐÀ˷ѵľ­Àú¡£¡±

jackson-databind °üº¬Jackson Êý¾Ý´¦ÀíÆ÷µÄ³£¼û¡°Êý¾Ý°ó¶¨º¯Êý¡±ºÍ¡°Ê÷Ä£ÐÍ¡±¡£Ëü¹¹½¨ÔÚStreaming API Ö®ÉÏ£¬²¢Ê¹ÓÃJackson ×¢ÊͽøÐÐÅäÖá£ÕâÊÇJacksonÌṩµÄ¸ß¼¶API£¬ÆäÖØÒªÐÔÊÇÏÔ¶øÒ×¼ûµÄ£¬ÒòΪËüÊÇ¿ª·¢ÈËÔ±×î³£Óõķ½·¨¡£

Jackson ×î³õµÄÓÃÀýÊÇJSON Êý¾Ý°ó¶¨£¬µ«ÏÖÔÚÖ»Òª´æÔÚ½âÎöÆ÷ºÍÉú³ÉÆ÷ʵÏÖ£¬Ëü¾Í¿ÉÒÔÓÃÓÚÆäËûÊý¾Ý¸ñʽ¡£µ«ÊÇ£¬Çë×¢Ò⣬¡°JSON¡±Ò»´ÊÈÔÈ»ÔÚÐí¶àµØ·½£¨ÀýÈçJsonGenerator£©µÄÀàÃû³ÆÖÐʹÓ㬾¡¹ÜËüʵ¼ÊÉϲ¢²»ÑϸñÒÀÀµÓÚJSON ¸ñʽ¡£

Ìáʾ£ºµ×²ãÁ÷APIʹÓÃI/O½øÐÐÊäÈëºÍÊä³ö£¬Òò´ËÀíÂÛÉÏÖ§³ÖÈκθñʽ¡£

°æ±¾Ð­ÒéJackson °æ±¾£º2.11.0 Spring Framework °æ±¾£º5.2.6.RELEASE Spring Boot °æ±¾£º2.3.0.RELEASE ´Ó±¾ÎÄ¿ªÊ¼Ìí¼ÓеÄÒýµ¼°ü¡£

com.fasterxml.jackson.corejackson-databindÌáʾ£ºjackson-databind Ä£¿é¶Ôjackson-core ºÍjackson-annotations ¾ßÓкÜÇ¿µÄÒÀÀµÐÔ¡£ÄãÖ»ÐèÒªµ¼ÈëÕâ¸ö°ü£¬ÆäËûÁ½¸ö¾Í»á×Ô¶¯°üº¬½øÀ´¡£

ÕâÀïÐèÒª½âÊͼ¸¾ä»°¡£ÎÒÖªµÀºËÐİüÖÐÒ²ÓÐJackson ×¢ÊÍ£¬µ«ÊÇÎÒÃDz»Ó¦¸Ã̸ÂÛËüÂð£¿ÒòΪʵ¼ÊÉÏ£¬Ö»Ì¸ÂÛJackson ×¢ÊÍÊÇûÓÐÒâÒåµÄ¡£±Ï¾¹×¢½âÐèÒª±»Êý¾Ý°ó¶¨Ä£¿é½âÎö£¬ËùÒÔÎÒÃÇÏÈÍê³ÉÕâ¸öÈ»ºóÔÙ»ØÈ¥¡£

ÕýÎľÝÎÒËùÖª£¬ºÜ¶àÅóÓѶÔJacksonµÄÁ˽ⶼÊÇ´ÓObjectMapper¿ªÊ¼ºÍ½áÊøµÄ¡£Òò´Ë£¬×÷ΪÎÒÃǽ«Òª½Ó´¥µÄµÚһƪÎÄÕ£¬ÈÃÎÒÃdz¹µ×Á˽âÕû¸öÊÂÇ飬֨µã¹Ø×¢Ó¦ÓóÌÐò¡£

¹¦Äܼò½éObjectMapper ÊÇjackson-databind Ä£¿éÖÐ×îÖØÒªµÄÀ࣬Íê³ÉÁ˱àÂëÈËÔ±½øÐÐÊý¾Ý°ó¶¨µÄ¡°¼¸ºõËùÓй¦ÄÜ¡±¡£ÕâÊÇΪÓû§ÌṩµÄ¸ß²ãAPI£¬×îµ×²ãÒÀÀµÁ÷ʽAPIÀ´ÊµÏÖ¶Á/д¡£ ObjectMapperÌṩµÄÖ÷Òª¹¦ÄÜÓУº

¡°¸ß¼¶¶¨ÖÆ¡±ÌṩÁ˶ÁдJSON£¨×îÖØÒªµÄ¹¦ÄÜ£©¡¢ÐòÁл¯/·´ÐòÁл¯³£¹æPOJO¡¢¶ÁдJSON Ê÷Ä£ÐÍÒÔ¼°ÀûÓù¦ÄÜÀ´Ê¹Óò»Í¬ÑùʽµÄJSON ÄÚÈݳÉΪ¿ÉÄÜ¡£¿É²åÈëµÄcom.fasterxml.jackson.databind.Module Ä£¿éÀ©Õ¹/·á¸»Á˹¦ÄÜ¡£Ëü»¹Ö§³Ö¡°¸ü¸ß¼¶¡±µÄ¶ÔÏó¸ÅÄÀýÈç¶à̬·ºÐÍ¡¢¶ÔÏóʶ±ð£¬²¢³äµ±¸ü¸ß¼¶£¨ÇÒ¸üÇ¿´ó£©µÄAPI¡£¶ÔÏó¶ÁÈ¡Æ÷ºÍ¶ÔÏóдÈëÆ÷µÄ¡°¹¤³§¡±¡£ ObjectReaderºÍObjectWriterµ×²ãÒ²ÊÇÒÀ¿¿Á÷ʽAPIÀ´ÊµÏÖ¶ÁдµÄ¡£¾¡¹Ü´ó²¿·Ö¶Á/дAPIÊÇͨ¹ýObjectMapper¹«¿ªµÄ£¬µ«Ò»Ð©¹¦Äܺ¯ÊýÈÔÈ»½öλÓÚObjectReader/ObjectWriterÖУ¬ÀýÈ磬¶ÔÓÚ¡°³¤ÐòÁС±¶Á/д¹¦ÄÜ£¬ObjectReader#readValues(InputStream)/ObjectWriter#writeValues(OutputStream) £©¡£ÕâÊÇÉè¼ÆÊ¦¹ÊÒâµÄ¡£ÓÉÓÚÕâÖÖÇé¿öºÜÉÙ¼û£¬Òò´ËÎÞÐèʹÓó£ÓòúÆ·À´Ó¦¶Ô¡£

Êý¾Ý°ó¶¨Êý¾Ý°ó¶¨·ÖΪ¼òµ¥Êý¾Ý°ó¶¨ºÍÍêÕûÊý¾Ý°ó¶¨¡£

¡¶¼òµ¥Êý¾Ý°ó¶¨¡·£ºintÀàÐÍ¡¢List¡¢MapµÈµÄ°ó¶¨.@Testpublicvoidtest1() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();//¼òµ¥ÀàÐÍÓëMapÀàÐ͵İó¶¨Integerage=objectMapper.readValue('1',int) .class);Mapmap=objectMapper.readValue('{\'name\':\'YourBatman\'}',Map.class);System.out.println(age);System.out.println(map);}ÔËÐгÌÐò²¢´òÓ¡Êä³ö¡£

1{name=YourBatman} ¡°ÍêÕûÊý¾Ý°ó¶¨¡±£º°ó¶¨µ½ÈκÎJava Bean ¶ÔÏó.×¼±¸POJO¡£

@Data@NoArgsConstructor@AllArgsConstructorpublicclassperson{privateStringname;privateIntegerage;} ½«Êý¾Ý°ó¶¨µ½POJO¡£

@Testpublicvoidtest2() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();personperson=objectMapper.readValue('{\'name\':\'YourBatman\',\'age\':18}',Person.class);System.out¡£ println(person);}ÔËÐгÌÐò²¢´òÓ¡Êä³ö¡£

(name=YourBatman,age=18)ʹÓÃObjectMapper ÔÚÓ¦ÓúͿª·¢ÖУ¬ObjectMapperÊÇÆù½ñΪֹ×î³£Óõģ¬Ò²ÊÇʹÓÃJacksonµÄÇÐÈëµã¡£±¾ÎÄÁгöÁËËüµÄʹÓó¡¾°¡£

Ìáʾ£ºÊ÷Ä£ÐÍÔÚµ¥¶ÀµÄÎĵµÖнéÉÜÒÔ·´Ó³ÆäÖØÒªÐÔ¡£

дÈ루ÐòÁл¯£©ÌṩÁËwriteValue()Õâ×é·½·¨ÓÃÓÚдÈëÊý¾Ý£¨ÈκÎÀàÐͶ¼¿ÉÒÔдÈ룩¡£Õâ¾ÍÊÇÎÒÃdz£ËµµÄ¡°ÐòÁл¯¡±¡£

writeValue(File resultFile, Object value)£ºÐ´ÈëÄ¿±êÎļþwriteValue(OutputStream out, Object value)£ºÐ´ÈëÊä³öÁ÷¡¶String writeValueAsString(Object value)£ºÒÔ×Ö·û´®¸ñʽдÈ룬´Ë·½·¨×î³£Óá· writeValueAsBytes (object value) : дÈë×Ö½ÚÊý×ébyte[]@Testpublicvoidtest3() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System.out.println('------------write simple type ----- - ---- ');System.out.println(objectMapper.writeValueAsString(18));System.out.println(objectMapper.writeValueAsString('YourBatman'));System.out.println(' ----- - ---- дÈ뼯ºÏÀàÐÍ----------');System.out.println(objectMapper.writeValueAsString(Arrays.asList(1,2,3)));System.out.println( objectMapper .writeValueAsString(newHashMap(){{put('zhName','A¸ç');put('enName','YourBatman');}}));System.out.println('- ----- ---write POJO----------');System.out.println(objectMapper.writeValueAsString(newperson('A¸ç',18)));}ÔËÐгÌÐò£¬Êä³ö¡£

----------±àдһ¸ö¼òµ¥ÀàÐÍ---------18'YourBatman'------------±àдһ¸ö¼¯ºÏÀàÐÍ-------- -- --- [1,2,3]{'zhName':'A¸ç','enName':'YourBatman'}----------±àдPOJO-------- -- --{'name ':'A¸ç','age':18} Read(·´ÐòÁл¯)ÌṩÁËÒ»×é·½·¨readValue()ÓÃÓÚ¶ÁÈ¡Êý¾Ý£¬Í¨³£¶ÁÈ¡×Ö·û´®ÀàÐÍ¡£Õâ¾ÍÊÇÎÒÃdz£ËµµÄ¡°·´ÐòÁл¯¡±¡£

readValue(String content, Class valueType)£º¶ÁȡΪָ¶¨ÀàÀàÐ͵ĶÔÏó¡£ÕâÊÇ×î³£Óõķ½·¨¡£ readValue(String content, TypeReference valueTypeRef)£ºT±íʾ³£ÓõķºÐÍÀàÐÍ£¬ÀýÈçList¡£Óëcollection/MapÏà·´.Serialized readValue(String content, JavaType valueType): JacksonÄÚÖõÄJavaTypeÀàÐÍ£¬ºóÃæ»áÏêϸ½âÊÍ£¨ºÜÉÙʹÓã© @Testpublicvoidtest4() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System. out.println('----- -----¶ÁÈ¡¼òµ¥ÀàÐÍ---------');System.out.println(objectMapper.readValue('18',Integer.class) ) ;//Å׳ö´íÎó£ºJsonParseException µ¥×Ö·û´®£¬½âÎöÅ׳ö´íÎó//System.out.println(objectMapper.readValue('YourBatman',String.class));System.out.println('----- - ----¶ÁÈ¡¼¯ºÏÀàÐÍ-- --------');System.out.println(objectMapper.readValue('[1,2,3]',List .class));System.out . println(objectMapper.readValue('{\ 'zhName\':\'A¸ç\',\'enName\':\'ÄãµÄòùòðÏÀ\'}',Map.class)); System.out.println('- - --------¶ÁÈ¡POJO----------');System.out.println(objectMapper.readValue('{\'name\':\'ÐÖµÜA\',\ 'age\':18}',person.class));}ÔËÐгÌÐò²¢´òÓ¡Êä³ö¡£

----------¶ÁÈ¡¼òµ¥ÀàÐÍ------------18----------¶ÁÈ¡¼¯ºÏÀàÐÍ------------ -[ 1, 2,3]{zhName=A¸ç£¬enName=ÄãµÄòùòðÏÀ}------------ÔĶÁPOJO----------ÈË(ÐÕÃû=A¸ç£¬ÄêÁä=18) ²»Í¬ÔÚÅÅÐòÖУ¬¡°all¡±¿ÉÒÔд³É×Ö·û´®¡£·´ÐòÁл¯³¡¾°¾ßÓÐÌØÊ⹦ÄÜ£¬ÈçʾÀýËùʾ¡£ ¡°ÆÕͨ¡±×Ö·û´®ÎÞ·¨·´ÐòÁл¯¡£

·ºÐÍÏû³ýÎÊÌâ´ÓÎÒÃÇʾÀýÖеÄÈý¸öread ·½·¨¿ÉÒÔ¿´³ö£¬ÎÊÌ⻹ûÓнáÊø£¬¾ÍÏñÕâ¸ö·ºÐ͵ÄÇé¿öÒ»Ñù¡£

@Testpublicvoidtest5() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System.out.println('------------¶ÁÈ¡¼¯ºÏÀàÐÍ----------');Listlist=objectMapper. readValue('[1,2,3]',List.class);Longid=list.get(0);System.out.println(id);} µ±ÎÒÔËÐгÌÐòʱ£¬ËüÅ׳öÒ»¸ö´íÎó¡£

----------¶ÁÈ¡¼¯ºÏÀàÐÍ----------java.lang.ClassCastException:java.lang.Integercannotbecasttojava.lang.Longatcn.yourbatman.jackson.core.ObjectMapperDemo.test5(ObjectMapperDemo.java:100 ).Òì³£¶ÑÕ»Ö¸³ö£º Long id=list.get(0); ¸ÃÓï¾äÏÔʾ¡°ÀàÐÍת»»Òì³£¡±¡£Õâ¾ÍÊÇÎÊÌâµÄÔ­Òò£ºÆÕ±é²Á³ý¡£ÕâÊÇÒ»¸ö²Î¿¼Í¼£¨ºÜÃ÷ÏÔ·ºÐÍÀàÐÍÊÇLong £¬µ«Ëüʵ¼ÊÉ**üº¬Integer ÀàÐÍ£©£º

ÔÚÕâÀàÎÊÌâÖУ¬×îºÃ¡°Ë¼¿¼¡±²¢ÎÊ¡°ÎÒ¿ÉÒÔд[1L£¬2L£¬3L]Â𣿡±¾¡¹ÜÍ·ÄԺܻîÔ¾£¬µ«ÏÖʵÈÔÈ»²Ð¿á£¬Ö´Ðйý³ÌÖÐÒ²»á³öÏÖ´íÎó¡£

com.fasterxml.jackson.core.JsonParseException:Unexpectedcharacter('L'(code76)):wasexpectingcommato SeamlessArrayentriesat[Source:(String)'[1L,2L,3L]';line:1,column:4].ÕâÊÇÒ»¸öµäÐ͵ķºÐÍÕâÊÇÒ»¸öÎÊÌâ²Á³ý¡£´ËÎÊÌâ½ö·¢ÉúÔÚ¶ÁÈ¡£¨·´ÐòÁл¯£©Ê±£¬²»»á·¢ÉúÔÚдÈëʱ¡£ÄÇôÎÒÃǸÃÈçºÎ½â¾öÕâ¸öÎÊÌâÄØ£¿

¡°ÔÚ½â¾öÕâ¸öÎÊÌâ֮ǰ£¬ÎÒÃÇÊ×ÏÈÒªÁ˽âJavaµÄ·ºÐͲÁ³ý£¬ÖÁÉÙÖªµÀÁ½¸ö½áÂÛ¡£¡±

µ±±àÒëJava ʱ£¬¡°Ò»Ð©¡±Í¨ÓÃÐÅÏ¢±»±£ÁôÔÚ×Ö½ÚÂëÖ¸Á֮Íâ¡£·ºÐͽӿڡ¢Àà¡¢·½·¨¶¨ÒåºÍ³ÉÔ±±äÁ¿ÉùÃ÷ÖеÄËùÓзºÐͶ¼ÊÇÀàÐͱ£ÁôµÄ¡£ ¡°ÆäËûµØ·½¡±µÄÐÅÏ¢¡¢Í¨ÓÃÐÅÏ¢½«±»É¾³ý¡£Õâ¸öÎÊÌâÔÚ¿ª·¢¹ý³ÌÖо­³£³öÏÖ¡£ÎªÁËÖ§³ÖÕâ¸öÀíÂÛ£¬A¸çÕë¶ÔÕâ¸öÎÊÌâÌṩÁËÁ½ÖÖ½â¾ö·½°¸¹©´ó¼Ò²Î¿¼¡£

½â¾ö·½°¸1£ºÊ¹ÓóÉÔ±±äÁ¿À´±£Áô·ºÐÍÀíÓÉ£º³ÉÔ±±äÁ¿µÄ·ºÐÍÀàÐͲ»»á±»É¾³ý

@Testpublicvoidtest6() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System.out.println('------------¶ÁÈ¡¼¯ºÏÀàÐÍ----------');Datadata=objectMapper. readValue('{\'ids\':[1,2,3]}',Data.class);Longid=data.getIds().get(0);System.out.println(id);}@lombok ¡£µ±DataprivatestaticclassData{privateListids;} ÔËÐгÌÐòʱ£¬Ò»Çж¼ºÜºÃ¡£

----------¶ÁÈ¡¼¯ºÏÀàÐÍ----------1 ½â¾ö·½°¸2£ºÊ¹Óùٷ½ÍƼöµÄTypeReference¡£¸Ã¹«Ê½ÒѾ­¿¼ÂÇÁËÕâÖÖÒ»°ã²Á³ýÎÊÌâ¡£ TypeReference ʹά»¤·ºÐÍÀàÐͱäµÃ¸ü¼ÓÈÝÒס£Õâ·Ç³£ÓÐÓá£

@Testpublicvoidtest7() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System.out.println('------------¶ÁÈ¡¼¯ºÏÀàÐÍ----------');Listids=objectMapper. readValue('[1,2,3]',newTypeReference(){});Longid=ids.get(0);System.out.println(id);}µ±ÎÒÔËÐгÌÐòʱ£¬Ò»Çж¼ºÜºÃ¡£

----------¶ÁÈ¡¼¯ºÏÀàÐÍ----------1 ´Ë½â¾ö·½°¸µÄ»ù±¾Ô­ÀíÊÇ·ºÐͽӿÚ/ÀàÖеķºÐÍÀàÐͲ»»á±»É¾³ý¡£

¶ÔÓÚ·ºÐͲÁ³ýÇé¿ö£¬½â¾ö·½°¸ÊÇ¡°±£Áô¡±·ºÐÍÀàÐÍ£¬Ê¹ÆäÔÚ·´ÐòÁл¯ÆÚ¼ä²»»á±»ÃɱΡ£³ý·ÇÄãÊÇϹ×Ó£¬·ñÔò½Ü¿ËÑ·±ðÎÞÑ¡Ôñ£¬Ö»ÄÜʹÓá°Í¨ÓÃ/ĬÈÏÀàÐÍ¡±¼ÓÔØ¡£

´Ó2.10°æ±¾¿ªÊ¼£¬JiaFanÌṩÁËJsonMapper£¬ËüÊÇObjectMapperµÄ×ÓÀà¡£Õâ¾ßÓиüÇåÎúµÄÓïÒå£¬ÌØ±ðÓÃÓÚ´¦ÀíJSON ¸ñʽ¡£

ÑϸñÀ´Ëµ£¬ObjectMapper²¢²»¾ÖÏÞÓÚ´¦ÀíJSON¸ñʽ£»ÀýÈçÏÂÃæ½éÉܵÄÁíÒ»¸ö×ÓÀàYAMLMapper£¬ÓÃÓÚÖ§³ÖYaml¸ñʽ£¨ÐèÒª¶îÍâµÄµ¼Èë°ü£¬¼ûÏÂÎÄ~£©

ÁíÍ⣬ÓÉÓÚ¹¹½¨ObjectMapperʵÀýÊÇÒ»¸ö¸ßƵ²Ù×÷£¬JacksonҲ˳Ӧ³±Á÷£¬ÌṩÁËMapperBuilder¹¹½¨Æ÷£¨2.10¼°¸ü¸ß°æ±¾£©¡£Í¨¹ýÕâ¸ö½á¹¹Ì壬Äã¿ÉÒÔºÜÈÝÒ׵ػñµÃÒ»¸öObjectMapper£¨ÀýÈçJsonMapper£©ÊµÀý¡£

@Testpublicvoidtest8() throwsJsonProcessingException{JsonMapperjsonMapper=JsonMapper.builder().configure(JsonReadFeature.ALLOW_SINGLE_QUOTES,true).build();personperson=jsonMapper.readValue('{'name':'YourBatman','age':18}', Person.class);System.out.println(person);} ÔËÐгÌÐò£¨Õý³£Êä³ö£©¡£

person(name=YourBatman,age=18) ·Ç³£¼òÒªµØ×ܽáÁ˱¾ÎĵÄÄÚÈÝ£¬²¢ÃèÊöÁËObjectMapper µÄÈÕ³£Ê¹Óá¢Ê¹ÓÃËü½øÐжÁ/дÒÔ¼°Ö´ÐÐÈÕ³£¹¦ÄÜ¡£Masu¡£

д×÷±È½Ï¼òµ¥¡£È«ÊÀ½ç¶¼Á÷ÐÐÒ»ÖÖwriteValueAsString(obj) ·½·¨£¬µ«ÊǶÔÓÚ¶ÁÈ¡À´Ëµ£¬³ýÁËʹÓÃreadValue(String content, Class valueType) ×Ô¶¯Íê³ÉÊý¾Ý°ó¶¨Ö®Í⣬»¹ÐèÒªÌØ±ð×¢Òâ¡£·ºÐͲÁ³ýÎÊÌ⣺¡°µ±·´ÐòÁл¯Îª¼¯ºÏÀàÐÍ£¨Collection »òMap£©Ê±£¬·ºÐÍÀàÐͻᱻ²Á³ý¡£´ËʱÄúÓ¦¸ÃʹÓÃreadValue(String content, TypeReference valueTypeRef) ·½·¨¡£¡±

Ìáʾ£ºÈç¹ûÄúÔÚÏîÄ¿Öз¢ÏÖÀàËÆobjectMapper.readValue(xxx, List.class) µÄ´úÂ룬Ôò¿ÉÄÜ´æÔÚ°²È«·çÏÕ£¨µ«²¢²»Ò»¶¨Òâζׯᱨ¸æ´íÎ󣩡£

ÔðÈα༭£ºµÂÇÚ¸ÖÌúÍø ±êÇ©£º

ÈÈÃÅËÑË÷

Ïà¹ØÎÄÕÂ

¹ã¸æ
µÂÇÚ¸ÖÌúÍø |¼Û¸ñ»ã×Ü

¶þÊ®²»»ó?£¬¶þÊ®²»»ó½â˵

chanong

|

×÷ÕߣºBATµÄÎÚÍаî

Ô­ÎÄÁ´½Ó£ºhttps://mp.weixin.qq.com/s/VYy1QVeFLRkciymFHueb5w

¼ò½éÔÚ±¾ÎÄÖУ¬ÎÒÃÇÐèÒª¼ÌÐøÌÖÂÛJackson µÄ¡°¸ß¼¶¡±²¿·Ö£ºÊý¾Ý°ó¶¨jackson-databind Ä£¿é¡£Í¨¹ýÉîÈëÁ˽â¸Ã¸ß¼¶API£¬Äú½«¼ÌÐø·¢ÏÖÎÒ»¨Á˺ܶàʱ¼ä½âÊ͵ÄÓмÛÖµµÄϸ½Ú²¿·Ö¡£´åÉÏ´ºÊ÷Ҳ˵¹ý£º¡°ÈËÉúûÓÐÀ˷ѵľ­Àú¡£¡±

jackson-databind °üº¬Jackson Êý¾Ý´¦ÀíÆ÷µÄ³£¼û¡°Êý¾Ý°ó¶¨º¯Êý¡±ºÍ¡°Ê÷Ä£ÐÍ¡±¡£Ëü¹¹½¨ÔÚStreaming API Ö®ÉÏ£¬²¢Ê¹ÓÃJackson ×¢ÊͽøÐÐÅäÖá£ÕâÊÇJacksonÌṩµÄ¸ß¼¶API£¬ÆäÖØÒªÐÔÊÇÏÔ¶øÒ×¼ûµÄ£¬ÒòΪËüÊÇ¿ª·¢ÈËÔ±×î³£Óõķ½·¨¡£

Jackson ×î³õµÄÓÃÀýÊÇJSON Êý¾Ý°ó¶¨£¬µ«ÏÖÔÚÖ»Òª´æÔÚ½âÎöÆ÷ºÍÉú³ÉÆ÷ʵÏÖ£¬Ëü¾Í¿ÉÒÔÓÃÓÚÆäËûÊý¾Ý¸ñʽ¡£µ«ÊÇ£¬Çë×¢Ò⣬¡°JSON¡±Ò»´ÊÈÔÈ»ÔÚÐí¶àµØ·½£¨ÀýÈçJsonGenerator£©µÄÀàÃû³ÆÖÐʹÓ㬾¡¹ÜËüʵ¼ÊÉϲ¢²»ÑϸñÒÀÀµÓÚJSON ¸ñʽ¡£

Ìáʾ£ºµ×²ãÁ÷APIʹÓÃI/O½øÐÐÊäÈëºÍÊä³ö£¬Òò´ËÀíÂÛÉÏÖ§³ÖÈκθñʽ¡£

°æ±¾Ð­ÒéJackson °æ±¾£º2.11.0 Spring Framework °æ±¾£º5.2.6.RELEASE Spring Boot °æ±¾£º2.3.0.RELEASE ´Ó±¾ÎÄ¿ªÊ¼Ìí¼ÓеÄÒýµ¼°ü¡£

com.fasterxml.jackson.corejackson-databindÌáʾ£ºjackson-databind Ä£¿é¶Ôjackson-core ºÍjackson-annotations ¾ßÓкÜÇ¿µÄÒÀÀµÐÔ¡£ÄãÖ»ÐèÒªµ¼ÈëÕâ¸ö°ü£¬ÆäËûÁ½¸ö¾Í»á×Ô¶¯°üº¬½øÀ´¡£

ÕâÀïÐèÒª½âÊͼ¸¾ä»°¡£ÎÒÖªµÀºËÐİüÖÐÒ²ÓÐJackson ×¢ÊÍ£¬µ«ÊÇÎÒÃDz»Ó¦¸Ã̸ÂÛËüÂð£¿ÒòΪʵ¼ÊÉÏ£¬Ö»Ì¸ÂÛJackson ×¢ÊÍÊÇûÓÐÒâÒåµÄ¡£±Ï¾¹×¢½âÐèÒª±»Êý¾Ý°ó¶¨Ä£¿é½âÎö£¬ËùÒÔÎÒÃÇÏÈÍê³ÉÕâ¸öÈ»ºóÔÙ»ØÈ¥¡£

ÕýÎľÝÎÒËùÖª£¬ºÜ¶àÅóÓѶÔJacksonµÄÁ˽ⶼÊÇ´ÓObjectMapper¿ªÊ¼ºÍ½áÊøµÄ¡£Òò´Ë£¬×÷ΪÎÒÃǽ«Òª½Ó´¥µÄµÚһƪÎÄÕ£¬ÈÃÎÒÃdz¹µ×Á˽âÕû¸öÊÂÇ飬֨µã¹Ø×¢Ó¦ÓóÌÐò¡£

¹¦Äܼò½éObjectMapper ÊÇjackson-databind Ä£¿éÖÐ×îÖØÒªµÄÀ࣬Íê³ÉÁ˱àÂëÈËÔ±½øÐÐÊý¾Ý°ó¶¨µÄ¡°¼¸ºõËùÓй¦ÄÜ¡±¡£ÕâÊÇΪÓû§ÌṩµÄ¸ß²ãAPI£¬×îµ×²ãÒÀÀµÁ÷ʽAPIÀ´ÊµÏÖ¶Á/д¡£ ObjectMapperÌṩµÄÖ÷Òª¹¦ÄÜÓУº

¡°¸ß¼¶¶¨ÖÆ¡±ÌṩÁ˶ÁдJSON£¨×îÖØÒªµÄ¹¦ÄÜ£©¡¢ÐòÁл¯/·´ÐòÁл¯³£¹æPOJO¡¢¶ÁдJSON Ê÷Ä£ÐÍÒÔ¼°ÀûÓù¦ÄÜÀ´Ê¹Óò»Í¬ÑùʽµÄJSON ÄÚÈݳÉΪ¿ÉÄÜ¡£¿É²åÈëµÄcom.fasterxml.jackson.databind.Module Ä£¿éÀ©Õ¹/·á¸»Á˹¦ÄÜ¡£Ëü»¹Ö§³Ö¡°¸ü¸ß¼¶¡±µÄ¶ÔÏó¸ÅÄÀýÈç¶à̬·ºÐÍ¡¢¶ÔÏóʶ±ð£¬²¢³äµ±¸ü¸ß¼¶£¨ÇÒ¸üÇ¿´ó£©µÄAPI¡£¶ÔÏó¶ÁÈ¡Æ÷ºÍ¶ÔÏóдÈëÆ÷µÄ¡°¹¤³§¡±¡£ ObjectReaderºÍObjectWriterµ×²ãÒ²ÊÇÒÀ¿¿Á÷ʽAPIÀ´ÊµÏÖ¶ÁдµÄ¡£¾¡¹Ü´ó²¿·Ö¶Á/дAPIÊÇͨ¹ýObjectMapper¹«¿ªµÄ£¬µ«Ò»Ð©¹¦Äܺ¯ÊýÈÔÈ»½öλÓÚObjectReader/ObjectWriterÖУ¬ÀýÈ磬¶ÔÓÚ¡°³¤ÐòÁС±¶Á/д¹¦ÄÜ£¬ObjectReader#readValues(InputStream)/ObjectWriter#writeValues(OutputStream) £©¡£ÕâÊÇÉè¼ÆÊ¦¹ÊÒâµÄ¡£ÓÉÓÚÕâÖÖÇé¿öºÜÉÙ¼û£¬Òò´ËÎÞÐèʹÓó£ÓòúÆ·À´Ó¦¶Ô¡£

Êý¾Ý°ó¶¨Êý¾Ý°ó¶¨·ÖΪ¼òµ¥Êý¾Ý°ó¶¨ºÍÍêÕûÊý¾Ý°ó¶¨¡£

¡¶¼òµ¥Êý¾Ý°ó¶¨¡·£ºintÀàÐÍ¡¢List¡¢MapµÈµÄ°ó¶¨.@Testpublicvoidtest1() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();//¼òµ¥ÀàÐÍÓëMapÀàÐ͵İó¶¨Integerage=objectMapper.readValue('1',int) .class);Mapmap=objectMapper.readValue('{\'name\':\'YourBatman\'}',Map.class);System.out.println(age);System.out.println(map);}ÔËÐгÌÐò²¢´òÓ¡Êä³ö¡£

1{name=YourBatman} ¡°ÍêÕûÊý¾Ý°ó¶¨¡±£º°ó¶¨µ½ÈκÎJava Bean ¶ÔÏó.×¼±¸POJO¡£

@Data@NoArgsConstructor@AllArgsConstructorpublicclassperson{privateStringname;privateIntegerage;} ½«Êý¾Ý°ó¶¨µ½POJO¡£

@Testpublicvoidtest2() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();personperson=objectMapper.readValue('{\'name\':\'YourBatman\',\'age\':18}',Person.class);System.out¡£ println(person);}ÔËÐгÌÐò²¢´òÓ¡Êä³ö¡£

(name=YourBatman,age=18)ʹÓÃObjectMapper ÔÚÓ¦ÓúͿª·¢ÖУ¬ObjectMapperÊÇÆù½ñΪֹ×î³£Óõģ¬Ò²ÊÇʹÓÃJacksonµÄÇÐÈëµã¡£±¾ÎÄÁгöÁËËüµÄʹÓó¡¾°¡£

Ìáʾ£ºÊ÷Ä£ÐÍÔÚµ¥¶ÀµÄÎĵµÖнéÉÜÒÔ·´Ó³ÆäÖØÒªÐÔ¡£

дÈ루ÐòÁл¯£©ÌṩÁËwriteValue()Õâ×é·½·¨ÓÃÓÚдÈëÊý¾Ý£¨ÈκÎÀàÐͶ¼¿ÉÒÔдÈ룩¡£Õâ¾ÍÊÇÎÒÃdz£ËµµÄ¡°ÐòÁл¯¡±¡£

writeValue(File resultFile, Object value)£ºÐ´ÈëÄ¿±êÎļþwriteValue(OutputStream out, Object value)£ºÐ´ÈëÊä³öÁ÷¡¶String writeValueAsString(Object value)£ºÒÔ×Ö·û´®¸ñʽдÈ룬´Ë·½·¨×î³£Óá· writeValueAsBytes (object value) : дÈë×Ö½ÚÊý×ébyte[]@Testpublicvoidtest3() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System.out.println('------------write simple type ----- - ---- ');System.out.println(objectMapper.writeValueAsString(18));System.out.println(objectMapper.writeValueAsString('YourBatman'));System.out.println(' ----- - ---- дÈ뼯ºÏÀàÐÍ----------');System.out.println(objectMapper.writeValueAsString(Arrays.asList(1,2,3)));System.out.println( objectMapper .writeValueAsString(newHashMap(){{put('zhName','A¸ç');put('enName','YourBatman');}}));System.out.println('- ----- ---write POJO----------');System.out.println(objectMapper.writeValueAsString(newperson('A¸ç',18)));}ÔËÐгÌÐò£¬Êä³ö¡£

----------±àдһ¸ö¼òµ¥ÀàÐÍ---------18'YourBatman'------------±àдһ¸ö¼¯ºÏÀàÐÍ-------- -- --- [1,2,3]{'zhName':'A¸ç','enName':'YourBatman'}----------±àдPOJO-------- -- --{'name ':'A¸ç','age':18} Read(·´ÐòÁл¯)ÌṩÁËÒ»×é·½·¨readValue()ÓÃÓÚ¶ÁÈ¡Êý¾Ý£¬Í¨³£¶ÁÈ¡×Ö·û´®ÀàÐÍ¡£Õâ¾ÍÊÇÎÒÃdz£ËµµÄ¡°·´ÐòÁл¯¡±¡£

readValue(String content, Class valueType)£º¶ÁȡΪָ¶¨ÀàÀàÐ͵ĶÔÏó¡£ÕâÊÇ×î³£Óõķ½·¨¡£ readValue(String content, TypeReference valueTypeRef)£ºT±íʾ³£ÓõķºÐÍÀàÐÍ£¬ÀýÈçList¡£Óëcollection/MapÏà·´.Serialized readValue(String content, JavaType valueType): JacksonÄÚÖõÄJavaTypeÀàÐÍ£¬ºóÃæ»áÏêϸ½âÊÍ£¨ºÜÉÙʹÓã© @Testpublicvoidtest4() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System. out.println('----- -----¶ÁÈ¡¼òµ¥ÀàÐÍ---------');System.out.println(objectMapper.readValue('18',Integer.class) ) ;//Å׳ö´íÎó£ºJsonParseException µ¥×Ö·û´®£¬½âÎöÅ׳ö´íÎó//System.out.println(objectMapper.readValue('YourBatman',String.class));System.out.println('----- - ----¶ÁÈ¡¼¯ºÏÀàÐÍ-- --------');System.out.println(objectMapper.readValue('[1,2,3]',List .class));System.out . println(objectMapper.readValue('{\ 'zhName\':\'A¸ç\',\'enName\':\'ÄãµÄòùòðÏÀ\'}',Map.class)); System.out.println('- - --------¶ÁÈ¡POJO----------');System.out.println(objectMapper.readValue('{\'name\':\'ÐÖµÜA\',\ 'age\':18}',person.class));}ÔËÐгÌÐò²¢´òÓ¡Êä³ö¡£

----------¶ÁÈ¡¼òµ¥ÀàÐÍ------------18----------¶ÁÈ¡¼¯ºÏÀàÐÍ------------ -[ 1, 2,3]{zhName=A¸ç£¬enName=ÄãµÄòùòðÏÀ}------------ÔĶÁPOJO----------ÈË(ÐÕÃû=A¸ç£¬ÄêÁä=18) ²»Í¬ÔÚÅÅÐòÖУ¬¡°all¡±¿ÉÒÔд³É×Ö·û´®¡£·´ÐòÁл¯³¡¾°¾ßÓÐÌØÊ⹦ÄÜ£¬ÈçʾÀýËùʾ¡£ ¡°ÆÕͨ¡±×Ö·û´®ÎÞ·¨·´ÐòÁл¯¡£

·ºÐÍÏû³ýÎÊÌâ´ÓÎÒÃÇʾÀýÖеÄÈý¸öread ·½·¨¿ÉÒÔ¿´³ö£¬ÎÊÌ⻹ûÓнáÊø£¬¾ÍÏñÕâ¸ö·ºÐ͵ÄÇé¿öÒ»Ñù¡£

@Testpublicvoidtest5() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System.out.println('------------¶ÁÈ¡¼¯ºÏÀàÐÍ----------');Listlist=objectMapper. readValue('[1,2,3]',List.class);Longid=list.get(0);System.out.println(id);} µ±ÎÒÔËÐгÌÐòʱ£¬ËüÅ׳öÒ»¸ö´íÎó¡£

----------¶ÁÈ¡¼¯ºÏÀàÐÍ----------java.lang.ClassCastException:java.lang.Integercannotbecasttojava.lang.Longatcn.yourbatman.jackson.core.ObjectMapperDemo.test5(ObjectMapperDemo.java:100 ).Òì³£¶ÑÕ»Ö¸³ö£º Long id=list.get(0); ¸ÃÓï¾äÏÔʾ¡°ÀàÐÍת»»Òì³£¡±¡£Õâ¾ÍÊÇÎÊÌâµÄÔ­Òò£ºÆÕ±é²Á³ý¡£ÕâÊÇÒ»¸ö²Î¿¼Í¼£¨ºÜÃ÷ÏÔ·ºÐÍÀàÐÍÊÇLong £¬µ«Ëüʵ¼ÊÉ**üº¬Integer ÀàÐÍ£©£º

ÔÚÕâÀàÎÊÌâÖУ¬×îºÃ¡°Ë¼¿¼¡±²¢ÎÊ¡°ÎÒ¿ÉÒÔд[1L£¬2L£¬3L]Â𣿡±¾¡¹ÜÍ·ÄԺܻîÔ¾£¬µ«ÏÖʵÈÔÈ»²Ð¿á£¬Ö´Ðйý³ÌÖÐÒ²»á³öÏÖ´íÎó¡£

com.fasterxml.jackson.core.JsonParseException:Unexpectedcharacter('L'(code76)):wasexpectingcommato SeamlessArrayentriesat[Source:(String)'[1L,2L,3L]';line:1,column:4].ÕâÊÇÒ»¸öµäÐ͵ķºÐÍÕâÊÇÒ»¸öÎÊÌâ²Á³ý¡£´ËÎÊÌâ½ö·¢ÉúÔÚ¶ÁÈ¡£¨·´ÐòÁл¯£©Ê±£¬²»»á·¢ÉúÔÚдÈëʱ¡£ÄÇôÎÒÃǸÃÈçºÎ½â¾öÕâ¸öÎÊÌâÄØ£¿

¡°ÔÚ½â¾öÕâ¸öÎÊÌâ֮ǰ£¬ÎÒÃÇÊ×ÏÈÒªÁ˽âJavaµÄ·ºÐͲÁ³ý£¬ÖÁÉÙÖªµÀÁ½¸ö½áÂÛ¡£¡±

µ±±àÒëJava ʱ£¬¡°Ò»Ð©¡±Í¨ÓÃÐÅÏ¢±»±£ÁôÔÚ×Ö½ÚÂëÖ¸Á֮Íâ¡£·ºÐͽӿڡ¢Àà¡¢·½·¨¶¨ÒåºÍ³ÉÔ±±äÁ¿ÉùÃ÷ÖеÄËùÓзºÐͶ¼ÊÇÀàÐͱ£ÁôµÄ¡£ ¡°ÆäËûµØ·½¡±µÄÐÅÏ¢¡¢Í¨ÓÃÐÅÏ¢½«±»É¾³ý¡£Õâ¸öÎÊÌâÔÚ¿ª·¢¹ý³ÌÖо­³£³öÏÖ¡£ÎªÁËÖ§³ÖÕâ¸öÀíÂÛ£¬A¸çÕë¶ÔÕâ¸öÎÊÌâÌṩÁËÁ½ÖÖ½â¾ö·½°¸¹©´ó¼Ò²Î¿¼¡£

½â¾ö·½°¸1£ºÊ¹ÓóÉÔ±±äÁ¿À´±£Áô·ºÐÍÀíÓÉ£º³ÉÔ±±äÁ¿µÄ·ºÐÍÀàÐͲ»»á±»É¾³ý

@Testpublicvoidtest6() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System.out.println('------------¶ÁÈ¡¼¯ºÏÀàÐÍ----------');Datadata=objectMapper. readValue('{\'ids\':[1,2,3]}',Data.class);Longid=data.getIds().get(0);System.out.println(id);}@lombok ¡£µ±DataprivatestaticclassData{privateListids;} ÔËÐгÌÐòʱ£¬Ò»Çж¼ºÜºÃ¡£

----------¶ÁÈ¡¼¯ºÏÀàÐÍ----------1 ½â¾ö·½°¸2£ºÊ¹Óùٷ½ÍƼöµÄTypeReference¡£¸Ã¹«Ê½ÒѾ­¿¼ÂÇÁËÕâÖÖÒ»°ã²Á³ýÎÊÌâ¡£ TypeReference ʹά»¤·ºÐÍÀàÐͱäµÃ¸ü¼ÓÈÝÒס£Õâ·Ç³£ÓÐÓá£

@Testpublicvoidtest7() throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();System.out.println('------------¶ÁÈ¡¼¯ºÏÀàÐÍ----------');Listids=objectMapper. readValue('[1,2,3]',newTypeReference(){});Longid=ids.get(0);System.out.println(id);}µ±ÎÒÔËÐгÌÐòʱ£¬Ò»Çж¼ºÜºÃ¡£

----------¶ÁÈ¡¼¯ºÏÀàÐÍ----------1 ´Ë½â¾ö·½°¸µÄ»ù±¾Ô­ÀíÊÇ·ºÐͽӿÚ/ÀàÖеķºÐÍÀàÐͲ»»á±»É¾³ý¡£

¶ÔÓÚ·ºÐͲÁ³ýÇé¿ö£¬½â¾ö·½°¸ÊÇ¡°±£Áô¡±·ºÐÍÀàÐÍ£¬Ê¹ÆäÔÚ·´ÐòÁл¯ÆÚ¼ä²»»á±»ÃɱΡ£³ý·ÇÄãÊÇϹ×Ó£¬·ñÔò½Ü¿ËÑ·±ðÎÞÑ¡Ôñ£¬Ö»ÄÜʹÓá°Í¨ÓÃ/ĬÈÏÀàÐÍ¡±¼ÓÔØ¡£

´Ó2.10°æ±¾¿ªÊ¼£¬JiaFanÌṩÁËJsonMapper£¬ËüÊÇObjectMapperµÄ×ÓÀà¡£Õâ¾ßÓиüÇåÎúµÄÓïÒå£¬ÌØ±ðÓÃÓÚ´¦ÀíJSON ¸ñʽ¡£

ÑϸñÀ´Ëµ£¬ObjectMapper²¢²»¾ÖÏÞÓÚ´¦ÀíJSON¸ñʽ£»ÀýÈçÏÂÃæ½éÉܵÄÁíÒ»¸ö×ÓÀàYAMLMapper£¬ÓÃÓÚÖ§³ÖYaml¸ñʽ£¨ÐèÒª¶îÍâµÄµ¼Èë°ü£¬¼ûÏÂÎÄ~£©

ÁíÍ⣬ÓÉÓÚ¹¹½¨ObjectMapperʵÀýÊÇÒ»¸ö¸ßƵ²Ù×÷£¬JacksonҲ˳Ӧ³±Á÷£¬ÌṩÁËMapperBuilder¹¹½¨Æ÷£¨2.10¼°¸ü¸ß°æ±¾£©¡£Í¨¹ýÕâ¸ö½á¹¹Ì壬Äã¿ÉÒÔºÜÈÝÒ׵ػñµÃÒ»¸öObjectMapper£¨ÀýÈçJsonMapper£©ÊµÀý¡£

@Testpublicvoidtest8() throwsJsonProcessingException{JsonMapperjsonMapper=JsonMapper.builder().configure(JsonReadFeature.ALLOW_SINGLE_QUOTES,true).build();personperson=jsonMapper.readValue('{'name':'YourBatman','age':18}', Person.class);System.out.println(person);} ÔËÐгÌÐò£¨Õý³£Êä³ö£©¡£

person(name=YourBatman,age=18) ·Ç³£¼òÒªµØ×ܽáÁ˱¾ÎĵÄÄÚÈÝ£¬²¢ÃèÊöÁËObjectMapper µÄÈÕ³£Ê¹Óá¢Ê¹ÓÃËü½øÐжÁ/дÒÔ¼°Ö´ÐÐÈÕ³£¹¦ÄÜ¡£Masu¡£

д×÷±È½Ï¼òµ¥¡£È«ÊÀ½ç¶¼Á÷ÐÐÒ»ÖÖwriteValueAsString(obj) ·½·¨£¬µ«ÊǶÔÓÚ¶ÁÈ¡À´Ëµ£¬³ýÁËʹÓÃreadValue(String content, Class valueType) ×Ô¶¯Íê³ÉÊý¾Ý°ó¶¨Ö®Í⣬»¹ÐèÒªÌØ±ð×¢Òâ¡£·ºÐͲÁ³ýÎÊÌ⣺¡°µ±·´ÐòÁл¯Îª¼¯ºÏÀàÐÍ£¨Collection »òMap£©Ê±£¬·ºÐÍÀàÐͻᱻ²Á³ý¡£´ËʱÄúÓ¦¸ÃʹÓÃreadValue(String content, TypeReference valueTypeRef) ·½·¨¡£¡±

Ìáʾ£ºÈç¹ûÄúÔÚÏîÄ¿Öз¢ÏÖÀàËÆobjectMapper.readValue(xxx, List.class) µÄ´úÂ룬Ôò¿ÉÄÜ´æÔÚ°²È«·çÏÕ£¨µ«²¢²»Ò»¶¨Òâζׯᱨ¸æ´íÎ󣩡£


¼Û¸ñ»ã×Ü