I am trying to manipulate some JSON data that I am receiving from a device in my home. As a starting point, I am trying to understand how exactly I should use the JSONPATH transformation. For example, I tried the followind code as part of a rule:
I was expecting the resulting TestString value would be “dd” but it rather turns out to be the whole untransformed json structure ‘{“aa”:“bb”, “cc”:“dd”}’. I tried several variants of the above without any more success.
Can someone please help me understand the problem?
Using exactly the same two lines as you, inside a rule which gets triggered when I switch a proxy switch, I get the correct result:
rule "JSONPath test"
when
Item sTestSwitch changed
then
val TestString = (transform("JSONPATH", '$.cc', '{"aa":"bb", "cc":"dd"}'))
logInfo("Rules", "test string: {}", TestString)
end
Result:
20:05:52.691 [INFO ] [.eclipse.smarthome.model.script.Rules] - test string: dd
If I were to guess, your issue is probably with the different " and ’ that you’re using. I wonder whether you might be better off jumping straight to using your actual JSON data, perhaps with the documentation as a guide (though you’ve essentially got code which should work already…). Presumably, as in the example, your JSON string will be stored in an Item?
EDIT: Oh, yeah, as @rossko57 mentions: you have installed the JSONPath add-on, right?
Unusual property of transformation service; if there’s a failure, you get the whole string back.
Note that JSONPATH is an installable add-on, but I’d expect you’d notice a complaint about that in your openhab.log
:@hafniumzinc@rosko OK, problem solved: I had not installed the JSONPath addon. After having done it, the transformation is working fine. Perhaps I should have asked for help before: I wasted quite a bit of time on this. The fact is that: 1) I had seen the documentation page you pointed to, but it does not mention that an addon is needed; and 2) the fact that the addon is missing should result in an error message, but there was none: just an incorrect result. Thanks a lot for your assistance!
Just played in 2.5.0 , sure enough a nonsense non-installed transform service will not be complained about by transform().
That’s a intentional feature I had not appreciated before. “But this is in the docs!”, haha.
There is an alternate call transformRaw() which does give feedback - but although that works, the current rules validator grizzles about it.