pythonjsonapimusixmatch

How to parse musixmatch python api JSON response?


How do you parse the JSON response from the musixmatch api? I'm calling the method res = artist_api.artist_search_get(format=format, q_artist=artist)

I'm getting a response of

{'message': {'body': {'artist_list': [{'artist': {'artist_alias_list': [],
                                                  'artist_comment': '',
                                                  'artist_country': '',
                                                  'artist_credits': {'artist_list': []},
                                                  'artist_edit_url': None,
                                                  'artist_id': 26575484.0,
                                                  'artist_mbid': None,
                                                  'artist_name': 'Illenium',
                                                  'artist_name_translation_list': [],
                                                  'artist_rating': 55.0, .........

I'm trying to get the artist_id.

I tried getting the artist_id like this:

    print(res['message']['body']['artist']['artist_id'])
artist_api = swagger_client.ArtistApi()
format = 'json' 

try:
    artist_list = ["adele", "lady gaga", "john legend"];
    for artist in artist_list:
        print(artist)
        res = artist_api.artist_search_get(format=format, q_artist=artist)
        print(res['message']['body']['artist']['artist_id'])
except ApiException as e:
    print "Exception when calling ArtistApi->artist_search_get: %s\n" % e

I'm getting this error message:

Traceback (most recent call last):
  File "musixmatch.py", line 39, in <module>
    print(res['message']['body']['artist_id'])
TypeError: 'InlineResponse2004' object has no attribute '__getitem__'

Please help I've searched through a bunch of threads but I still can't find the answer to this. I'm new to python so I'm not sure what I'm doing wrong.


Solution

  • You a little messed up with the hierarchy of JSON-document, use this code to get desired values:

    [artist['artist']['artist_id'] for artist in res['message']['body']['artist_list']]
    

    As an alternative, can be used JSONPath-expression: $..artist_list..artist_id to get the same result.

    Example

    from jsonpath_rw import parse
    import json
    
    res = json.loads("""{
      "message": {
        "header": {},
        "body": {
          "artist_list": [
            {
              "artist": {
                "artist_credits": {            },
                "artist_country": "string",
                "artist_id": 110
              }
            },
            {
              "artist": {
                "artist_credits": {},
                "artist_country": "string",
                "artist_id": 220
              }
            }        
          ]
        }
      }
    }""")
    
    # 1-way: Iterate through JSON-document
    print([artist['artist']['artist_id'] for artist in res['message']['body']['artist_list']])
    # result: [110, 220]
    
    # 2-way: Use JSONPath-expression
    jsonpath_expr = parse('$..artist_list..artist_id')
    print([match.value for match in jsonpath_expr.find(res)])
    # result: [110, 220]