Solved

How to setAttribute lists in PythonCaller

  • 30 August 2017
  • 3 replies
  • 33 views

Badge +1

Hi,

I want to output a list from JSON using the PythonCaller.

I have tried the following syntax but it doesn't work.

info = json.loads(data)

for item in info:

 

feature.setAttribute("_list{}.value",item["time"])

Does anyone have any suggestions?

I am using FME Desktop 2017.0

Thank you

 

icon

Best answer by geosander 31 August 2017, 11:23

View original

3 replies

Userlevel 4
Badge +30

Hi @aquamarine,

I posted a question here about JSON in Python:

JSON with Python

Thanks,

Danilo

Badge

Hi @aquamarine,

If you want to do this in Python (presuming that "info" is a list of dicts, but not a dict itself!), you have to set each list attribute individually, like so:

info = json.loads(data)
num_items = len(info)
for i in range(num_items):
time = info[i]["time"]
feature.setAttribute("_list{{{}}}.value".format(i), item["time"])

Because Python's format() function replaces curly braces with function parameters, but FME needs these curly braces so it knows it's a list, you'll have to do e.g. "_list{{{}}}".format(3) which will return _list{3}.

But if your JSON input string comes from an FME attribute and you only need to explode it into a list, I'd recommend @takashi's approach and not use any Python at all, but to resort to transformers like the JSONFlattener (which is probably the one you need!), JSONExtractor and JSONFragmenter. Much cleaner.

Badge +1

Hi @aquamarine,

If you want to do this in Python (presuming that "info" is a list of dicts, but not a dict itself!), you have to set each list attribute individually, like so:

info = json.loads(data)
num_items = len(info)
for i in range(num_items):
time = info[i]["time"]
feature.setAttribute("_list{{{}}}.value".format(i), item["time"])

Because Python's format() function replaces curly braces with function parameters, but FME needs these curly braces so it knows it's a list, you'll have to do e.g. "_list{{{}}}".format(3) which will return _list{3}.

But if your JSON input string comes from an FME attribute and you only need to explode it into a list, I'd recommend @takashi's approach and not use any Python at all, but to resort to transformers like the JSONFlattener (which is probably the one you need!), JSONExtractor and JSONFragmenter. Much cleaner.

Thanks @sander_s

 

I tried your code and that worked perfectly.

 

 

Thanks also @takashi for your advice.  I will try those JSON transformers too as an alternative method.

 

Reply