Does JSON syntax allow duplicate keys in an object?

后端 未结 12 1912
青春惊慌失措
青春惊慌失措 2020-11-22 00:05

Is this valid json?

{
    \"a\" : \"x\",
    \"a\" : \"y\"
}

http://jsonlint.com/ says yes.

http://www.json.org/ doesn\'t say anyth

12条回答
  •  执念已碎
    2020-11-22 00:19

    The short answer: Yes but is not recommended.
    The long answer: It depends on what you call valid...


    ECMA-404 "The JSON Data Interchange Syntax" doesn't say anything about duplicated names (keys).


    However, RFC 8259 "The JavaScript Object Notation (JSON) Data Interchange Format" says:

    The names within an object SHOULD be unique.

    In this context SHOULD must be understood as specified in BCP 14:

    SHOULD This word, or the adjective "RECOMMENDED", mean that there may exist valid reasons in particular circumstances to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course.


    RFC 8259 explains why unique names (keys) are good:

    An object whose names are all unique is interoperable in the sense that all software implementations receiving that object will agree on the name-value mappings. When the names within an object are not unique, the behavior of software that receives such an object is unpredictable. Many implementations report the last name/value pair only. Other implementations report an error or fail to parse the object, and some implementations report all of the name/value pairs, including duplicates.



    Also, as Serguei pointed out in the comments: ECMA-262 "ECMAScript® Language Specification", reads:

    In the case where there are duplicate name Strings within an object, lexically preceding values for the same key shall be overwritten.

    In other words, last-value-wins.


    Trying to parse a string with duplicated names with the Java implementation by Douglas Crockford (the creator of JSON) results in an exception:

    org.json.JSONException: Duplicate key "status"  at
    org.json.JSONObject.putOnce(JSONObject.java:1076)
    

提交回复
热议问题