def test_boolean_should_be_lowercase(self):
     self.assertFalse(is_json('{"bool": True}'))
     self.assertFalse(is_json('{"bool": FALSE}'))
     self.assertTrue(is_json('{"bool": true}'))
     self.assertIsInstance(json.loads('{"bool": true}'), dict)
     self.assertTrue(is_json('{"bool": false}'))
     self.assertIsInstance(json.loads('{"bool": false}'), dict)
 def test_external_spaces_are_ignored(self):
     self.assertTrue(is_json('{"foo":"bar"}'))
     self.assertTrue(is_json(' { "foo": "bar" } '))
     self.assertTrue(is_json('''
         {
             "foo": "bar"
         }
     '''))
     self.assertTrue(is_json('''
     [
         1, 2, 3
     ]
     '''))
    def test_complete_json_case(self):
        string = '''
            {
                "books": [
                    {
                        "title": "Book title 1",
                        "author": "FirstName LastName",
                        "tags": ["tech", "programming", "python"],
                        "available": true,
                        "pageCount": 516,
                        "rating": 4.5,
                        "comments": [
                            {
                                "author": "FirstName LastName",
                                "content": "Nice book!"
                            }
                        ]
                    },
                    {
                        "title": "Book title 2",
                        "author": "FirstName LastName",
                        "tags": ["tech", "programming", "javascript"],
                        "available": true,
                        "rating": 4,
                        "pageCount": 422,
                        "comments": [

                        ]
                    }
                ]
            }
        '''
        self.assertTrue(is_json(string))
        self.assertIsInstance(json.loads(string), dict)
 def test_array_is_json(self):
     self.assertTrue(is_json('[1,2,3]'))
     self.assertTrue(is_json('[]'))
     self.assertTrue(is_json('["foo", "bar"]'))
     self.assertTrue(is_json('[true]'))
     self.assertTrue(is_json('[false]'))
     self.assertTrue(is_json('[{"a": "b"}]'))
    def test_non_string_objects_are_properly_handled(self):
        # noinspection PyTypeChecker
        self.assertFalse(is_json({'a': 1}))

        # noinspection PyTypeChecker
        self.assertFalse(is_json(None))

        # noinspection PyTypeChecker
        self.assertFalse(is_json([1, 2, 3]))

        # noinspection PyTypeChecker
        self.assertFalse(is_json(500))

        # noinspection PyTypeChecker
        self.assertFalse(is_json(True))

        # noinspection PyTypeChecker
        self.assertFalse(is_json({1, 2}))
 def test_string_values_should_be_wrapped_by_double_quotes(self):
     self.assertFalse(is_json('{"foo": hello}'))
     self.assertFalse(is_json('{"foo": \'hello\'}'))
     self.assertTrue(is_json('{"foo": "hello"}'))
 def test_quotes_should_be_double_quotes(self):
     self.assertFalse(is_json("{'foo': 1}"))
     self.assertFalse(is_json("['boo', 'bar']"))
 def test_cannot_have_multiple_comma_in_array(self):
     self.assertFalse(is_json('{"numbers": [1,2,,3]}'))
 def test_array_can_be_empty(self):
     self.assertTrue(is_json('{"array": []}'))
     self.assertTrue(is_json('{"array": [ ]}'))
 def test_float_numbers_should_use_dot_as_separator(self):
     self.assertFalse(is_json('{"float": 4,5}'))
     self.assertTrue(is_json('{"float": 4.5}'))
     self.assertIsInstance(json.loads('{"float": 4.5}'), dict)
 def test_json_object_can_be_empty(self):
     self.assertTrue(is_json('{}'))
 def test_empty_string_are_invalid(self):
     self.assertFalse(is_json(''))
     self.assertFalse(is_json(' '))
 def test_string_can_contain_escaped_quotes(self):
     s = '{"string": "Look: \\"escaped string here!\\""}'
     self.assertTrue(is_json(s))
     self.assertIsInstance(json.loads(s), dict)
 def test_cannot_have_multiple_comma_in_object(self):
     self.assertFalse(is_json('{"numbers": {"a": 1,, "b": 2}}'))
 def test_cannot_have_trailing_comma_in_object(self):
     self.assertFalse(is_json('{"numbers": {"a": 1, "b": 2,}}'))
 def test_null_should_be_lowercase(self):
     self.assertFalse(is_json('{"null": NULL}'))
     self.assertFalse(is_json('{"null": Null}'))
     self.assertTrue(is_json('{"null": null}'))
     self.assertIsInstance(json.loads('{"null": null}'), dict)
 def test_int_number_can_be_any_length(self):
     self.assertTrue(is_json('{"number": 1}'))
     self.assertTrue(is_json('{"number": 99}'))
     self.assertTrue(is_json('{"number": 1000}'))
     self.assertTrue(is_json('{"number": 1234567890}'))
 def test_json_array_can_be_empty(self):
     self.assertTrue(is_json('[]'))
 def test_negative_numbers_should_be_start_with_minus(self):
     self.assertFalse(is_json('{"number": - 2}'))
     self.assertFalse(is_json('{"number": - 2.5}'))
     self.assertTrue(is_json('{"number": -2}'))
     self.assertTrue(is_json('{"number": -2.5}'))
 def test_attributes_quotes_are_mandatory(self):
     self.assertFalse(is_json('{foo: 1}'))
 def test_object_can_be_empty(self):
     self.assertTrue(is_json('{"obj": {}}'))
     self.assertTrue(is_json('{"obj": { }}'))
 def test_cannot_have_trailing_comma_in_array(self):
     self.assertFalse(is_json('{"numbers": [1,2,3,]}'))