3 SLjr@sdZdZyddlmZWn ek r8ddlmZYnXddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZddlmZdZeejjejjejjejjgZeejjejjgZeejjejjgZd Zd Zd Ze j e j!d Z"e j d Z#Gddde$Z%Gddde%Z&Gddde%Z'd=ddZ(d>ddZ)ddZ*Gddde+Z,ddZ-d d!Z.d"d#Z/d?d$d%Z0d@d&d'Z1e j2e3fZ4Gd(d)d)e+Z5dAd*d+Z6d,d-Z7d.d/Z8d0d1Z9d2d3gd4d5gd4d5gd6d7gd8d9gd4d5gd:d;gd<Z:dS)BatContains routines for printing protocol messages in JSON format. Simple usage example: # Create a proto object and serialize it to a json format string. message = my_proto_pb2.MyMessage(foo='bar') json_string = json_format.MessageToJson(message) # Parse a json format string to proto object. message = json_format.Parse(json_string, my_proto_pb2.MyMessage()) zjieluo@google.com (Jie Luo)) OrderedDictN) methodcaller) descriptor)symbol_databasez%Y-%m-%dT%H:%M:%SZInfinityz -InfinityZNaNzF[\ud800-\udbff](?![\udc00-\udfff])|(?|D]6}t|trn|rhd} qrd} n|} j ||||| <qPW|||<qj t j j krfdd|D||<qjr} | jjjr| jt j jkr| j t j jkr| j} d| j|f}j |||<qj |||<qWjr|j} x| jD]j t j j krdjt j jks@jrpq@jrj}nj}||krq@tri||<n,j t j j krg||<nj j||<q@WWn6tk r} ztdjj| WYdd} ~ XnX|S) z?Converts normal message according to Proto3 JSON Specification.valuetruefalsecsg|]}j|qSr )_FieldToJsonObject).0k)r r"r r sz8_Printer._RegularMessageToJsonObject..z[%s.%s]z#Failed to serialize {0} field: {1}.N) ListFieldsrname json_namer!rfields_by_name isinstanceboolr1labelrrLABEL_REPEATED is_extensionZcontaining_typerZmessage_set_wire_formatrrZLABEL_OPTIONALr(rr'fieldscpp_typeCPPTYPE_MESSAGEcontaining_oneofZ default_value ValueErrorr format) r"rr&r>r.r6Zv_fieldZjs_mapkeyZ recorded_keyfr-er )r r"r r,sf           "z$_Printer._RegularMessageToJsonObjectcCs|jtjjkr|j|S|jtjjkr^|jjj|d}|dk rD|j S|j j dkrT|St dn|jtjj kr|jtjjkrtj|jdS|SnZ|jtjjkrt|S|jtkrt|S|jtkrtj|r|dkrtStStj|rtS|S)zConverts Value message according to Proto3 JSON Specification.ZkindN null_value list_value struct_value)Z WhichOneof_ListValueMessageToJsonObjectrarbgetattrr'r8r1)r"rZwhichr.Zoneof_descriptorr r r _ValueMessageToJsonObject1s    z"_Printer._ValueMessageToJsonObjectcsfdd|jDS)zBConverts ListValue message according to Proto3 JSON Specification.csg|]}j|qSr )re)r2r.)r"r r r4Csz:_Printer._ListValueMessageToJsonObject..)values)r"rr )r"r rcAs z&_Printer._ListValueMessageToJsonObjectcCs.|j}i}x|D]}|j||||<qW|S)z?Converts Struct message according to Proto3 JSON Specification.)r>re)r"rr>retrDr r r _StructMessageToJsonObjectFs  z#_Printer._StructMessageToJsonObjectcCs|j|jjd|jS)Nr.)r1r'r8r.)r"rr r r r*Nsz$_Printer._WrapperMessageToJsonObjectN)FF)rrr r r#rrr,r1r^r_rercrhr*r r r r rs  E!rcCs |jjdkS)Nzgoogle/protobuf/wrappers.proto)rLr6)r-r r r r)Ssr)cCs8i}x.|D]&\}}||kr(tdj||||<q W|S)Nz'Failed to load JSON: duplicate key {0}.)rrC)r&resultr6r.r r r _DuplicateCheckerWs  rjc CsZtj}|jdd}y|jj|}Wn"tk rHtdj|YnX|j|}|S)N/z1Can not find message descriptor by type_url: {0}.) rZDefaultsplitZpoolZFindMessageTypeByNameKeyError TypeErrorrCZ GetPrototype)r[ZdbZ type_namer-Z message_classr r r r\`s r\cCst|tjs|jd}y(tjdkr.tj|}ntj|td}Wn4t k rr}zt dj t |WYdd}~XnXt |||S)abParses a JSON representation of a protocol message into a message. Args: text: Message JSON representation. message: A protocol buffer message to merge into. ignore_unknown_fields: If True, do not raise errors for unknown fields. Returns: The same message passed as argument. Raises:: ParseError: On JSON parsing problems. zutf-8r)Zobject_pairs_hookzFailed to load JSON: {0}.N)rrq)r9six text_typerQsys version_infor$loadsrjrBrrCrT ParseDict)textrignore_unknown_fieldsr&rFr r r Parsens   $rzcCst|}|j|||S)a.Parses a JSON dictionary representation into a message. Args: js_dict: Dict representation of a JSON message. message: A protocol buffer message to merge into. ignore_unknown_fields: If True, do not raise errors for unknown fields. Returns: The same message passed as argument. )_ParserConvertMessage)Zjs_dictrryparserr r r rws  rwc@s`eZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ dS)r{z(JSON format parser for protocol message.cCs ||_dS)N)ry)r"ryr r r r#sz_Parser.__init__cCsT|j}|j}t|r"|j||n.|tkrDtt|d|||n |j||dS)zConvert a JSON object into a message. Args: value: A JSON object. message: A WKT or regular protocol message to record the data. Raises: ParseError: In case of convert problems. rlN)r'r(r)_ConvertWrapperMessager+r_ConvertFieldValuePair)r"r.rr-r(r r r r|s z_Parser.ConvertMessagecCsg}|j}tdd|jD}xl|D]b}y|j|d}|sN|jj|d}| rtj|r|jsttdj |j |dd}dj |j ddd}|j j|}|s|jrw&tdj |j ||j||krtdj |jj ||j||jdk r(|jj} | |krtd j |jj | |j| ||} | dkrz|jtjjkrl|jj d krlt||j} d | _n |j|jw&t|r|j|j|j| ||n,|jtjjkrt|j|jt| t std j || |jtjjkr8x| D]B} t||jj!} | dkr$| jj d kr$td |j"| | qWn:x| D]0} | dkrTtd t||jjt#| |q>WnZ|jtjjkr|j$r|j |} n t||j} | j%|j"| | nt&||jt#| |Wq&tk r$} z6|r|jdkrtdj || n tt'| WYdd} ~ Xq&t(k rV} ztdj || WYdd} ~ Xq&t)k r} ztdj || WYdd} ~ Xq&Xq&WdS)zConvert field value pairs into regular message. Args: js: A JSON object to convert the field value pairs. message: A regular protocol message to record the data. Raises: ParseError: In case of problems converting. css|]}|j|fVqdS)N)r7)r2rEr r r sz1_Parser._ConvertFieldValuePair..Nz)Message type {0} does not have extensionsrl.zVMessage type "{0}" has no field named "{1}". Available Fields(except extensions): {2}z9Message type "{0}" should not have multiple "{1}" fields.z?Message type "{0}" should not have multiple "{1}" oneof fields.zgoogle.protobuf.Valuerz.repeated field {0} must be in [] which is {1}.zAnull is not allowed to be used as an element in a repeated field.zFailed to parse {0} field: {1}zFailed to parse {0} field: {1}.rmrm)*r'dictr>rKr8_VALID_EXTENSION_NAMEmatchZ is_extendablerrCr(joinrnZ ExtensionsZ_FindExtensionByNameryappendrAr6r?rrr@rrdr` ClearFieldr!_ConvertMapFieldValuer;r<r9listaddr|_ConvertScalarFieldValuer=Z SetInParentsetattrrTrBrp)r"r&rnamesr-Zfields_by_json_namer6r Z identifierZ oneof_namer.r]itemrFr r r rs                           z_Parser._ConvertFieldValuePairc Cst|tr| rdSy |d}Wntk r<tdYnXt|}|j}|j}t|rl|j|d|n8|t krt t |d|d||n|d=|j |||j |_ ||_dS)z/Convert a JSON representation into Any message.Nz@typez*@type is missing when parsing any message.r.rl)r9rrorr\r'r(r)r~r+rrZSerializeToStringr.r[)r"r.rr[r]r-r(r r r _ConvertAnyMessages$   z_Parser._ConvertAnyMessagecCs|j|dS)z?Convert a JSON representation into message with FromJsonString.N)ZFromJsonString)r"r.rr r r _ConvertGenericMessage7sz_Parser._ConvertGenericMessagecCst|tr|j||jnjt|tr4|j||jnP|dkrDd|_n@t|trV||_ n.t|t j rj||_ nt|t r|||_ntddS)z1Convert a JSON representation into Value message.Nrz"Unexpected type for Value message.)r9r_ConvertStructMessagerbr_ConvertListValueMessagerar`r:Z bool_valuerrZ string_typesZ string_value _INT_OR_FLOATZ number_valuer)r"r.rr r r _ConvertValueMessage=s     z_Parser._ConvertValueMessagecCsFt|tstdj||jdx|D]}|j||jjq(WdS)z5Convert a JSON representation into ListValue message.z%ListValue must be in [] which is {0}.rfN)r9rrrCrrrfr)r"r.rrr r r rNs     z _Parser._ConvertListValueMessagecCs@t|tstdj|x"|D]}|j|||j|qWdS)z2Convert a JSON representation into Struct message.z&Struct must be in a dict which is {0}.N)r9rrrCrr>)r"r.rrDr r r rWs    z_Parser._ConvertStructMessagecCs"|jjd}t|dt||dS)z3Convert a JSON representation into Wrapper message.r.N)r'r8rr)r"r.rr r r r r~`s z_Parser._ConvertWrapperMessagecCst|tstdj|j||jjd}|jjd}x^|D]V}t||d}|jt j j krv|j ||t ||j|q:t|||t ||j|<q:WdS)a5Convert map field value for a message map field. Args: value: A JSON object to convert the map field value. message: A protocol message to record the converted data. field: The descriptor of the map field to be converted. Raises: ParseError: In case of convert problems. z-Map field {0} must be in a dict which is {1}.rDr.TN)r9rrrCr6rr8rr?rrr@r|rd)r"r.rr Z key_fieldZ value_fieldrD key_valuer r r res       z_Parser._ConvertMapFieldValueN)rrr r r#r|rrrrrrr~rr r r r r{sj  r{c Cs$|jtkrt|S|jtkr$t|S|jtjjkr)s         <    f 0