Bruno Lorena
Bruno Lorena

Reputation: 93

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.

Upvotes: 1

Views: 139

Answers (1)

β.εηοιτ.βε
β.εηοιτ.βε

Reputation: 39129

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

Upvotes: 1

Related Questions