Theoretically speaking, though, you can’t touch ActivityPub JSON without a fully-featured JSON-LD engine. Because the specification allows a lot of things to be either objects or collections or links, so you can’t trust what you get back without flattening. (IMO this is a reason it was a bad idea for ActivityPub and ActivityStreams2 to be based on JSON-LD. It should have been significantly more restrictive.)
This is a good guide, practically speaking.
Theoretically speaking, though, you can’t touch ActivityPub JSON without a fully-featured JSON-LD engine. Because the specification allows a lot of things to be either objects or collections or links, so you can’t trust what you get back without flattening. (IMO this is a reason it was a bad idea for ActivityPub and ActivityStreams2 to be based on JSON-LD. It should have been significantly more restrictive.)