age icon indicating copy to clipboard operation
age copied to clipboard

Python Driver's _nodeToJson() returns invalid JSON

Open omaurel-socha opened this issue 2 years ago • 2 comments

Describe the bug I am trying some cypher queries using the python driver. When iterating the results of a query, The function .toJson() returns a JSON string containing a trailing comma in the "properties" field.
As a result, the JSON is invalid and it is not possible to convert it into a dict using json.loads() for example.

How are you accessing AGE (Command line, driver, etc.)?

  • Python Driver

What data setup do we need to do?

def testJson(self):

        print("\n------------------------------")
        print("Test 6: Testing JSON output.....")
        print("--------------------------------\n")

        ag = self.ag

        with ag.connection.cursor() as cursor:
            try:
                ag.cypher(cursor, "CREATE (n:Person {name: %s}) ", params=('Joe',))
                ag.cypher(cursor, "CREATE (n:Person {name: %s}) ", params=('Jack',))
                ag.cypher(cursor, "CREATE (n:Person {name: %s}) ", params=('Andy',))
                ag.cypher(cursor, "CREATE (n:Person {name: %s}) ", params=('Smith',))
                ag.cypher(cursor, "CREATE (n:Person {name: %s}) ", params=('Tom',))

                # You must commit explicitly
                ag.commit()
            except Exception as ex:
                print(ex)
                ag.rollback()

        print(" -------- TESTING JSON #1 --------")
        cursor = ag.execCypher("MATCH (n) RETURN n")

        for row in cursor:
            # json.loads will fail if the json str is not properly formatted
            as_dict = json.loads(row[0].toJson())
        print("Vertex.toJson() returns a correct json string.")

What is the command that caused the error?

for row in cursor:
    as_dict = json.loads(row[0].toJson())

Expected behavior The correct behavior would return valid JSON when calling .toJson().

Additional context The problem originates in _nodeToJson(). The way the buffer writing iteration is done in the properties field will always add a trailing comma.

I have submitted a PR to fix the issue

omaurel-socha avatar Sep 12 '23 12:09 omaurel-socha

I tested this myself and I can confirm the vertexes created are looking like this:

{label:Person, id:844424930131969, properties:{name: Joe, }}::VERTEX

Which is not a correct JSON string.

Also, I confirm that the PR #1228 fixes the issue.

markgomer avatar Sep 20 '23 14:09 markgomer

Hi @omaurel-socha! Thank you very much for bringing up this issue. And thank you @markgomer for confirming it. Our team is now going through the PR to get it merged. @dehowef

jimenasansav avatar Sep 21 '23 18:09 jimenasansav

This issue is stale because it has been open 60 days with no activity. Remove "Abondoned" label or comment or this will be closed in 14 days.

github-actions[bot] avatar Jun 17 '24 00:06 github-actions[bot]

@rafsun42 Could you look into this?

jrgemignani avatar Jun 17 '24 21:06 jrgemignani

@jrgemignani It seems the issue was resolved by PR #1228.

rafsun42 avatar Jun 21 '24 18:06 rafsun42