ǰ×à
ʹÓà Gson £¨https://github.com/google/gson£©È¥½âÎö json Ó¦¸ÃÊǺܳ£¼ûµÄ£¬´ó²¿·ÖµÄÇé¿öÏÂÎÒÃÇÖ»Òª´´½¨Ò»¸ö
Gson ¶ÔÏó£¬È»ºó¸ù¾Ý json ºÍ¶ÔÓ¦µÄ Java ÀàÈ¥½âÎö¾Í¿ÉÒÔÁË¡£

µ«ÊǶÔÓڱȽϸ´Ô json£¬±ÈÈçÏÂÃæÕâÖÖ£¬ attributes ¶ÔÓ¦µÄ jsonObject
ÖеÄ×Ö¶ÎÊÇÍêÈ«²»Ò»ÑùµÄ£¬Õâ¸öʱºòÔÙ¼òµ¥µÄÓÃÉÏÃæµÄ·½·¨¾Í½âÎö²»ÁËÁË¡£

µ±È»ÁË£¬ÎÒÃÇ˵һ²½µ½Î»µÄ·½Ê½½â¾ö²»ÁË£¬µ«ÓÃÒ»µã±¿·½·¨»¹ÊÇ¿ÉÒԵġ£±ÈÈçÏÈÊÖ¶¯½âÎöÄõ½ attributes
¶ÔÓ¦µÄ jsonObject£¬¸ù¾ÝÓëËüͬ¼¶ type ¶ÔÓ¦µÄ value ¾Í¿ÉÒÔÅжÏÕâÒ»¶Î jsonObject
¶ÔÓ¦µÄ Java ÀàÊÇÄĸö£¬×îºó¾Í²ÉÓà gson.from() ·½·¨½âÎö³ö attributes ¶ÔÓ¦µÄ

ËäÈ»ÕâÑùÄÜʵÏÖÕû¸ö json µÄ·´ÐòÁл¯£¬µ«ÊÇÕâÖÖ·½Ê½±È½ÏÂé·³£¬¶øÇÒÒ»µãÒ²²»ÓÅÑÅ£¬Èç¹ûÏîÄ¿ÖдæÔںܶàÕâÑùµÄÇé¿ö£¬¾Í»á×öºÜ¶àÖØ¸´µÄÌåÁ¦ÀͶ¯¡£
ÈçºÎ¸üÓÅÑÅ¡¢¸üͨÓõĽâ¾öÕâÀàÎÊÌ⣬ÔÚÍøÉÏûÓÐÕÒµ½´ð°¸£¬Ö»ºÃÈ¥ÉîÈëÑо¿Ò»ÏÂGsonÁË¡£´ø×ÅÕâÑùµÄÄ¿µÄ£¬·¿´ÁËGsonµÄÎĵµ£¨https://github.com/google/gson/blob/master/UserGuide.md£©£¬·¢ÏÖÁËÒ»¾ä»°

Õâ¾ä»°Ëµ Gson ¿ÉÒÔ´¦ÀíÈÎÒâµÄ Java ¶ÔÏó¡£ÄÇô¶ÔÓÚÉÏÃæ½²µÄÄÇÖÖ·´ÐòÁл¯Çé¿öÀ´½²£¬ Gson
Ó¦¸ÃÒ²ÄÜ×öµ½¡£Í¨¹ýÑо¿ Gson µÄÎĵµ£¬·¢ÏÖ¿ÉÒÔͨ¹ý×Ô¶¨ÒåJsonDeserializerµÄ·½Ê½À´ÊµÏÖ½âÎöÕâÖÖ
jsonObject ÀàÐͲ»Í¬µÄÇé¿ö¡£
ÎÒÃÇÖªµÀ£¬´ó²¿·ÖÇé¿öÏ Gson ÊÇͨ¹ýÖ±½Ó new ³öÀ´µÄ·½Ê½À´´´½¨£¬²»¹ýÒ²¿ÉÒÔ²ÉÓà GsonBuilder
Õâ¸öÀàÈ¥Éú³É Gson¡£
 GsonBuilder ͨ¹ý registerTypeAdapter()·½·¨£¬¶ÔÄ¿±êÀà½øÐÐ×¢²á¡£µ±ÐòÁл¯»òÕß·´ÐòÁл¯Ä¿±êÀàµÄʱºò¾Í»áµ÷ÓÃÎÒÃÇ×¢²áµÄtypeAdapter£¬
ÕâÑù¾ÍʵÏÖÁËÈ˹¤¸ÉÔ¤ Gson µÄÐòÁл¯ºÍ·´ÐòÁл¯¹ý³Ì¡£
GsonBuilder µÄ registerTypeAdapte() ·½·¨µÄµÚ¶þ¸ö²ÎÊýÊÇ Object
ÀàÐÍ£¬Ò²¾ÍÒâζ×ÅÎÒÃÇ¿ÉÒÔ×¢²á¶àÖÖÀàÐ굀 typeAdapter£¬Ä¿Ç°Ö§³ÖµÄÀàÐÍÓÐ JsonSerializer¡¢JsonDeserializer¡¢InstanceCreator¡¢TypeAdapter¡£

¾¹ýÒ»·¬µ·¹Ä£¬Ð´ÁËÒ»¸ö¹¤¾ßÀ࣬¶ÔÓÚÉÏÃæµÄÄǸö¸´ÔÓ json£¬ÓÃÁ˲»µ½10ÐдúÂë¾Í¸ã¶¨£¬¶øÇұȽÏÓÅÑźÍͨÓá£

±¾Îľͼòµ¥·ÖÎöÒ»ÏÂÈçºÎͨ¹ý×Ô¶¨Òå JsonDeserializer À´ÊµÏÖÒ»¸öͨÓõŤ¾ßÀàÓÃÓÚ½âÎö¸´ÔÓÀàÐÍ
json¡£¶ÔÓÚÒÔºóÅöµ½ÏàËÆÎÊÌ⣬ÕâÖÖ´¦Àí·½·¨¿ÉÒÔÌṩһÖÖ½â¾öÎÊÌâµÄ˼·¡£¾ßÌåµÄ´úÂëºÍʵÀý£¬¿ÉÒԲ鿴ÏîÄ¿£¨https://github.com/sososeen09/MultiTypeJsonParser£©¡£Èç¹û¶ÔÄúµÄ˼·ÓÐһЩÆô·¢£¬»¶Ó½»Á÷ºÍStar¡£
JsonDeserializer½éÉÜ
JsonDeserializer ÊÇÒ»¸ö½Ó¿Ú£¬Ê¹ÓõÄʱºòÐèҪʵÏÖÕâ¸ö½Ó¿Ú²¢ÔÚ GsonBuilder
ÖжԾßÌåµÄÀàÐÍÈ¥×¢²á¡£µ±·´ÐòÁл¯µ½¶ÔÓ¦µÄÀàµÄʱºò¾Í»áµ÷ÓÃÕâ¸ö×Ô¶¨Òå JsonDeserializer
µÄ deserialize() ·½·¨¡£ÏÂÃæ¶ÔÕâ¸ö·½·¨µÄ¼¸¸ö²ÎÊý×öһϽâÊÍ£¬ÒÔ±ãÓÚ¸üºÃµÄÀí½âGson½âÎöµÄ¹ý³Ì¡£

JsonElement
JsonElement´ú±í ÔÚ Gson ÖеĴú±íÒ»¸öÔªËØ¡£ËüÊÇÒ»¸ö³éÏóÀ࣬ÓÐ4¸ö×ÓÀࣺJsonObject¡¢JsonArray¡¢JsonPrimitive¡¢JsonNull¡£
¢ñ.JsonObject ±íʾµÄÊǰüº¬name-valueÐ굀 json ×Ö·û´®£¬ÆäÖÐ name
ÊÇ×Ö·û´®£¬¶ø value ¿ÉÒÔÊÇÆäËüÀàÐ굀 JsonElement ÔªËØ¡£ÔÚjsonÖÐÓà ¡°{}¡±
°ü¹üÆðÀ´µÄÒ»¸öÕûÌå¾ÍÊÇJsonObject¡£ÀýÈç

¢ò.JsonArray Õâ¸öÀàÔÚ Gson Öдú±íÒ»¸öÊý×éÀàÐÍ£¬Ò»¸öÊý×é¾ÍÊÇJsonElementµÄ¼¯ºÏ£¬Õâ¸ö¼¯ºÏÖÐÿһ¸öÀàÐͶ¼¿ÉÄܲ»Í¬¡£ÕâÊÇÒ»¸öÓÐÐòµÄ¼¯ºÏ£¬Òâζ×ÅÔªËØµÄÌí¼Ó˳ÐòÊDZ»Î¬³Ö×ŵġ£ÉÏÃæÀý×ÓÖÐlist¶ÔÓ¦µÄ
¡°[]¡± °ü¹üÆðÀ´µÄjson¾ÍÊÇJsonArray¡£
¢ó.JsonPrimitive Õâ¸ö¿ÉÒÔÈÏΪÊÇjsonÖеÄÔʼÀàÐ͵ÄÖµ£¬°üº¬JavaµÄ8¸ö»ù±¾ÀàÐͺÍËüÃǶÔÓ¦µÄ°ü×°ÀàÐÍ£¬Ò²°üº¬
String ÀàÐÍ¡£±ÈÈçÉÏÃæ "first-name" ¶ÔÓ¦µÄ "Su"
¾ÍÊÇÒ»¸ö String ÀàÐ굀 JsonPrimitive ¡£
¢ô.JsonNull ͨ¹ýÃû×ÖÒ²¿ÉÒԲµ½£¬Õâ¸ö´ú±íµÄÊÇ null Öµ¡£
Type
TypeÊÇJavaÖеÄËùÓÐÀàÐ͵Ķ¥²ã½Ó¿Ú£¬ËüµÄ×ÓÀàÓÐ GenericArrayType¡¢ParameterizedType¡¢TypeVariable¡¢WildcardType£¬Õâ¸ö¶¼ÊÇÔÚjava.lang.reflect°üÏÂÃæµÄÀà¡£ÁíÍ⣬ÎÒÃÇ×îÊìϤµÄÒ»¸öÀà
Class ҲʵÏÖÁË Type ½Ó¿Ú¡£
Ò»°ãÀ´½²£¬µ÷Óà GsonBuilder µÄ registerTypeAdapter() È¥×¢²á£¬µÚÒ»¸ö²ÎÊýʹÓÃ
Class ÀàÐ;ͿÉÒÔÁË¡£
JsonDeserializationContext
Õâ¸öÀàÊÇÔÚ·´ÐòÁйý³ÌÖУ¬ÓÉÆäËüÀàµ÷ÓÃÎÒÃÇ×Ô¶¨ÒåµÄ JsonDeserialization µÄ deserialize()
·½·¨Ê±´«µÝ¹ýÀ´µÄ£¬ÔÚ Gson ÖÐËüΨһµÄÒ»¸öʵÏÖÊÇTreeTypeAdapter ÖеÄÒ»¸ö˽ÓеÄÄÚ²¿Àà
GsonContextImpl ¡£¿ÉÒÔÔÚ×Ô¶¨ÒåµÄ JsonDeserializer µÄ deserialize()
ÖÐÈ¥µ÷Óà JsonDeserializationContext µÄ deserialize() ·½·¨È¥»ñµÃÒ»¸ö¶ÔÏó¡£
µ«ÊÇÒª¼Çס£¬Èç¹û´«µÝµ½ JsonDeserializationContext ÖÐµÄ json Óë
JsonDeserializer ÖÐµÄ json Ò»ÑùµÄ»°£¬¿ÉÄܻᵼÖÂËÀÑ»·µ÷Óá£
˼··ÖÎö
´´½¨JavaBean
»¹ÊÇÒÔ×îÉÏÃæµÄÄǸö json ½øÐзÖÎö£¬ÔÚ list ¶ÔÓ¦ JsonArray £¬ÆäÖеÄÁ½¸ö JsonObject
ÖУ¬attributes ¶ÔÓ¦µÄ JsonObject ×Ö¶ÎÍêÈ«²»Ò»Ñù£¬µ«ÊÇΪÁËͳһ£¬ÔÚд JavaBean
µÄʱºò¿ÉÒÔ¸øËüÃÇÉèÖÃÒ»¸ö¹²Í¬µÄ¸¸À࣬¾¡¹ÜËüÊǿյġ£

ÉèÖà Attribute Õâ¸ö SuperClass Ö»ÊÇΪÁËÔÚ GsonBuilder È¥×¢²á£¬µ±¾ßÌå½âÎöµÄʱºòÎÒÃÇ»á¸ù¾Ý
type ¶ÔÓ¦µÄÀàÐÍÈ¥ÕÒµ½¶ÔÓ¦µÄClass¡£

µ½ÁËÕâÀïÎÒÃǾÍÓ¦¸ÃÏëµ½£¬type ¶ÔÓ¦µÄ value ¿Ï¶¨ÊÇÒªÓë¾ßÌåµÄ JavaBean ¶ÔÓ¦ÆðÀ´µÄ¡£±ÈÈçÔÚÕâÀï¾ÍÊÇ

Èç¹û type ÊÇ "address" £¬ÄÇôÎÒÃǾͿÉÒÔÓà gson È¥Äà AddressAttribute.class
ºÍ¶ÔÓ¦µÄ json È¥½âÎö¡£

ÈçºÎ°Ñ json ׼ȷµÄתΪ¶ÔÓ¦µÄ JavaBean
ÎÒÃÇ×¢²áµÄÊǸ¸Àà Attribute £¬µ±·´ÐòÁл¯ÐèÒª½âÎö Attribute µÄʱºò¾Í»á°Ñ¶ÔÓ¦µÄ
json ×÷Ϊ²ÎÊý»Øµ÷×Ô¶¨ÒåµÄ JsonDeserializer ¡£ÎÒÃǾͿÉÒÔÔÚÏÂÃæÕâ¸ö·½·¨ÖÐд×Ô¼ºµÄÂß¼µÃµ½ÎÒÃÇÐèÒªµÄ
Attribute ¶ÔÏóÁË¡£

µ«ÊÇϸÐĵÄÅóÓÑÓ¦¸Ã»á·¢ÏÖÁË£¬Õâ¸öʱºò´«µÝµÄ json ÓпÉÄÜÊÇÕâÑùµÄ
Ò²ÓпÉÄÜÊÇÕâÑùµÄ

ÎÒÃÇÔõô֪µÀ¸Ã½âÎö³É AddressAttribute »¹ÊÇ NameAttribute £¿£¿£¿
ÎÒÃÇÏëÏ룬¾ßÌå½âÎö³ÉÄĸö£¬ÎÒÃǿ϶¨ÊÇÐèÒªÖªµÀ type ¶ÔÓ¦µÄ value ¡£¶øÕâ¸ö type ÊÇÓë
attributes ͬ¼¶µÄ×ֶΣ¬ÕÕןղÅÕâÑù¿Ï¶¨ÊÇûϣÍûÄõ½Õâ¸ö value µÄ¡£
ÎÒÃÇÔÙÏëÏ룬Äܹ»ÖªµÀÕâ¸ö type ¶ÔÓ¦µÄ value ÊÇʲôµÄ¿Ï¶¨ÊÇ attributes ÉÏÒ»²ã¼¶µÄ
json ¡£

ÄÇôÎÒÃǿɲ»¿ÉÒÔÔÚ GsonBuilder ÖÐÔÙÈ¥×¢²áÒ»¸ö typeAdapter À´½âÎöÕâ¸öÍâ²ãµÄ
json ÄØ£¿µ±È»¿ÉÒÔ¡£

Õâ¸ö AttributeWithType ¾ÍÊÇÍâ²ãµÄ json ¶ÔÓ¦µÄ JavaBean

ÔÚ·´ÐòÁл¯ AttributeWithType Õâ¸öÀàµÄʱºò£¬ÎÒÃÇ¿ÉÒÔ»ñµÃÕâ¸ö type ¶ÔÓ¦µÄ
value£¬È»ºó°ÑÕâ¸ö value ´«µÝ¸øÀï²ãµÄ Attribute ¶ÔÓ¦µÄ JsonDeserializer¡£ÕâÑù¾Í¿ÉÒÔ¸ù¾Ý
value ÊÇ ¡°address¡± »òÕß ¡°name¡± È¥¶Ô AddresAttribute »òÕß
NameAttribute ½øÐз´ÐòÁл¯ÁË¡£
ÓÐÒ»¸ö¿Ó
Ç°ÃæÄÇÎÒÃǽ²¹ý£¬µ÷Óà JsonDeserializationContext µÄ·½·¨Ó¦¸Ã×¢ÒâËÀÑ»·¡£ÔÚ¾ßÌåµÄʵ¼ùÖУ¬ÎÒËäȻûÓе÷ÓÃ
JsonDeserializationContext µÄ·½·¨£¬µ«ÊÇÒÀÈ»³öÏÖÁËËÀÑ»·µÄÇé¿ö¡£¾ÍÊÇÒòΪÎÒÊÇÕâôÓõġ£

Õ§Ò»¿´Ã»Ê²Ã´ÎÊÌâ°¡£¬ÎÊÌâ¾Í³öÔÚÕâ¸ö gson ÉíÉÏ¡£Õâ¸ö gson ÊÇÒѾע²á¹ý½âÎö AttributeWithType
µÄ GsonBuilder ´´½¨µÄ¡£ gson.fromJson() ·½·¨ÖÐµÄ json ÊÇ AttributeWithType
¶ÔÓ¦µÄ·´ÐòÁл¯µÄ json£¬gson.fromJson() ÄÚ²¿»áÔٴε÷Óà AttributeWithType
¶ÔÓ¦µÄ JsonDeserializer ÖÐµÄ deserialize() ·½·¨£¬´Ó¶øµ¼ÖÂËÀÑ»·¡£
±ÜÃâËÀÑ»·µÄ·½Ê½¾ÍÊÇÓÃGsonBuilderн¨Ò»¸ö gson £¬Õâ¸öGsonBuilder²»ÔÙ×¢²á
AttributeWithType £¬¶øÖ»È¥×¢²á Attribute È¥½âÎö¡£
ΪÁ˸üºÃ¸üͨÓÃ
¢ñ.ÔÚÏîÄ¿ÖУ¬¿ÉÄÜ»¹»á´æÔÚÁíÒ»ÖÖ¸ñʽµÄjson£¬ÍⲿûÓе¥¶ÀµÄtypeÔªËØ£¬¶øÊÇÓëÆäËüµÄÔªËØ·ÅÔÚͬһ¸öJsonObjectÖС£ÕâÑùµÄ¸ñʽ¸üʡʣ¬²»ÐèҪע²áÍâ²ãµÄtypeAdaper¼´¿É¡£

¢ò.Èç¹ûÔÚ½âÎö¹ý³ÌÖз¢ÏÖÓÐЩÀàÐÍûÓÐ×¢²áµ½ MultiTypeJsonParser µÄ Builder
ÖУ¬½âÎöµÄʱºòÅöµ½ÏàÓ¦µÄ jsonObject ¾ÍÖ±½Ó·µ»Ønull¡£±ÈÈçÏÂÃæÕâÑùµÄjsonÖУ¬"type"
¶ÔÓ¦µÄ "parents" Èç¹ûûÓÐ×¢²á£¬ÄÇô·´ÐòÁл¯µÄʱºòÕâ¸ö json Ëù´ú±íµÄ¶ÔÏó¾ÍΪ
null ¡£

ÔÚAndroidÖÐÎÒÃÇ·´ÐòÁÐÕâÑùµÄ json ºóÒ»°ã»á°ÑµÃµ½µÄ¶ÔÏóµÄÉèÖõ½ÁÐ±í¿Ø¼þÉÏ£¬Èç¹ûºó¶Ë·µ»ØµÄ
json Öаüº¬Ö®Ç°Î´×¢²áµÄÀàÐÍ£¬ÎªÁ˳ÌÐò²»ÖÁÓÚ crash£¬ÐèÒª¶Ô·´ÐòÁл¯µÄ null ¶ÔÏó½øÐйýÂË£¬ÏîÄ¿ÖÐÌṩÁËÒ»¸ö¹¤¾ßÀà
ListItemFilter ¿ÉÒÔ¹ýÂ˼¯ºÏÖÐΪ null µÄÔªËØ¡£
½áÓï
¶ÔÓÚÈçºÎÓÅÑŵĽâÎöÕâÖÖÀàÐͲ»Í¬µÄ JsonObject £¬¸Õ¿ªÊ¼ÎÒÊÇȱÉÙ˼·µÄ£¬ÔÚÍøÉÏҲûÓв鵽ºÏÊʵÄÎĵµ¡£µ«ÊÇͨ¹ý²é¿´
Gson µÄÎĵµºÍÔ´Â룬ͨ¹ý×Ô¼ºµÄÀí½âºÍ·ÖÎö£¬Öð²½µÄÍê³ÉÁËÕâ¸ö¹ý³Ì¡£ÎÒµÄÒ»¸ö¸Ð´¥¾ÍÊÇ£¬¶àÈ¥¿´¿´¹Ù·½µÄʹÓÃÎĵµÓ¦¸Ã±ÈäĿȥËÑË÷½â¾ö·½°¸¸üºÃ¡£
´úÂëÊÇ×îºÃµÄÎĵµ£¬±¾ÎÄÖ»¼òµ¥½éÉÜÁËһЩʵÏÖ˼·£¬ÎÄÖÐÌù³öµÄһЩ´úÂëÊÇΪÁ˽²Êö·½±ã£¬ÓëÏîÄ¿ÖеĴúÂë¿ÉÄÜ»áÓÐÓÐÐ©Çø±ð¡£¾ßÌåµÄʹÓÿÉÒÔ¿´ÏîÄ¿£¨https://github.com/sososeen09/MultiTypeJsonParser£©ÖеÄÀý×Ó¡£ |