Search code examples
pythonjsonjmespath

How can I get attribute valus of a JSON using JMESPath


I need to get the value of _ISSUE_CURRENCY.

I have a JSON which is as below:

{
    '#value': 'VR-GROUP PLC',
    '_ISSUE_CURRENCY': 'EUR',
    '_PRICING_MULTIPLIER': 1,
    '_TYPE': 'Debt',
    '_SETTLEMENT_CALENDAR_ID': 'Tgt',
    '_SUBTYPE': 'Bond',
    '_IS_UNIT_TRADED': 'N',
    '_ISSUE_STATUS': 'Active',
    '_OWNERSHIP_TYPE': 'Unknown',
    '_ISSUE_METHOD': 'Unknown',
    '_DENOMINATION_CURRENCY': 'EUR'
}

My code so far:

f_asset = open(f"{tempdir}\\cdwassets_all.csv").read().replace("\n", "")
json_obj_asset = json.loads(f_asset, strict=False)

try:
    issue_cur = jmespath.search("validatedAsset.assetName", doc)
except:
    issue_cur = ''
# currency.append(issue_cur)
print(issue_cur) 

# output: 
{'#value': 'VR-GROUP PLC', '_ISSUE_CURRENCY': 'EUR', '_PRICING_MULTIPLIER': 1, '_TYPE': 'Debt', '_SETTLEMENT_CALENDAR_ID': 'Tgt', '_SUBTYPE': 'Bond', '_IS_UNIT_TRADED': 'N', '_ISSUE_STATUS': 'Active', '_OWNERSHIP_TYPE': 'Unknown', '_ISSUE_METHOD': 'Unknown', '_DENOMINATION_CURRENCY': 'EUR'}

I tried to do it this way, but without success.

issue_cur = jmespath.search("validatedAsset.assetName", doc)["_ISSUE_CURRENCY"]
print(issue_cur) 

# output
{'#value': 'VR-GROUP PLC', '_ISSUE_CURRENCY': 'EUR', '_PRICING_MULTIPLIER': 1, '_TYPE': 'Debt', '_SETTLEMENT_CALENDAR_ID': 'Tgt', '_SUBTYPE': 'Bond', '_IS_UNIT_TRADED': 'N', '_ISSUE_STATUS': 'Active', '_OWNERSHIP_TYPE': 'Unknown', '_ISSUE_METHOD': 'Unknown', '_DENOMINATION_CURRENCY': 'EUR'}

I need to verify that _ISSUE_CURRENCY attribute exists.


Solution

  • You are stating:

    I have a JSON which is as below

    This is not a JSON, as described in the RFC 7159, describing what is a valid JavaScript Object Notation (JSON), the quotation mark that delimits strings is the character %x22, so a double quote ".reference

    This should actually be raised by the json.loads function call of your code already, the script:

    import json
    
    json_data = """
    {
      'validatedAsset': {
        'assetName': {
          '#value': 'VR-GROUP PLC',
          '_ISSUE_CURRENCY': 'EUR',
          '_PRICING_MULTIPLIER': 1,
          '_TYPE': 'Debt',
          '_SETTLEMENT_CALENDAR_ID': 'Tgt',
          '_SUBTYPE': 'Bond',
          '_IS_UNIT_TRADED': 'N',
          '_ISSUE_STATUS': 'Active',
          '_OWNERSHIP_TYPE': 'Unknown',
          '_ISSUE_METHOD': 'Unknown',
          '_DENOMINATION_CURRENCY': 'EUR'
        }
      }
    }
    """
    
    json.loads(json_data, strict=False)
    

    Would raise:

    json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 3 (char 5)

    So, I am going to assume that what you are calling a valid JSON is the actual print of the json.loads function, which is then a valid Python dictionary.

    So, you just have to modify your JMESPath query to get the _ISSUE_CURRENCY, and make it this query:

    validatedAsset.assetName._ISSUE_CURRENCY
    

    Which would give you EUR as a result.


    Given the code

    import json
    import jmespath
    
    json_data = """
    {
      "validatedAsset": {
        "assetName": {
          "#value": "VR-GROUP PLC",
          "_ISSUE_CURRENCY": "EUR",
          "_PRICING_MULTIPLIER": 1,
          "_TYPE": "Debt",
          "_SETTLEMENT_CALENDAR_ID": "Tgt",
          "_SUBTYPE": "Bond",
          "_IS_UNIT_TRADED": "N",
          "_ISSUE_STATUS": "Active",
          "_OWNERSHIP_TYPE": "Unknown",
          "_ISSUE_METHOD": "Unknown",
          "_DENOMINATION_CURRENCY": "EUR"
        }
      }
    }
    """
    
    print(jmespath.search(
      "validatedAsset.assetName._ISSUE_CURRENCY",
      json.loads(json_data, strict=False)
    ))
    

    This yields:

    EUR