2016-12-02 108 views
4

我寫了一個函數來驗證Python中的Json對象。以下是代碼片段:數字字符串屬於Json嗎?

def is_json(myjson): 
    """ 
    Check whether a string is a json object. 
    :param myjson: the string to check 
    :return: True/False 
    """ 
    try: 
     json_object = json.loads(myjson) 
    except ValueError, e: 
     return False 
    return True 

不過,我偶然發現,它允許數字串。例如,

is_json("123") # return True 
is_json("-123") # return True 
is_json("0123") # return False 
is_json(" 123") # return True 

從我的理解,數量不應該是JSON數據的一部分。我也用其他一些Json formatter tool進行了確認。如果這是真的,爲什麼json.loads允許數字字符串?

+0

whicg python version? –

+0

@ ItayMoav-Malimovka Python 2.7.12 – ichbinblau

+1

@Kevin yes python似乎使用RFC 7159,因此這是正確的。 https://docs.python.org/3/library/json.html –

回答

4

它看起來像Python的json模塊支持JSON由RFC 7159規定:

JSON(JavaScript對象符號),由RFC 7159(該淘汰了RFC 4627)

與播放各地指定驗證器鏈接,「123」在4627無效,但在7159有效。

比較兩個RFC,它看起來像包含有效JSON文本的定義變得更加寬泛。在4627:

JSON-text = object/array

而在7159:

JSON-text = ws value ws

(WS意爲 「一個可選的空格」)

所以最初你只能有一個o bject或數組,但是現在你可以有一個值,它是「一個對象,數組,數字或字符串,或者其中一個名字:false null tr​​ue」。

json模塊文檔進一步討論的區別:

由廢棄的RFC 4627中指定的舊版本JSON的要求一個JSON文本的頂部電平值必須是一個JSON對象或陣列( Python字典或列表),並且不能是JSON空值,布爾值,數字或字符串值。 RFC 7159刪除了這個限制,而且這個模塊沒有,也沒有在其串行器或解串器中實現這個限制。

+0

如果我想讓我的函數遵守RFC 4627 COS,我想排除驗證器函數中的數字,該怎麼辦? – ichbinblau

+1

@ this-vidor,哎呀,我認爲「價值」是「有效的獨立JSON文檔」的同義詞,但它真的是「JSON文本」。編輯。 – Kevin

+0

@Theresa,看起來好像沒有任何簡單的方法可以使用內置模塊來製作符合RFC 4627的嚴格分析器。原則上你可以編寫你自己的解析器(也許使用Lex/Yacc/Flex/Bison),但這是一種「不包含電池」的方法(我甚至不確定這些工具如何與Python集成)。 – Kevin