Hi, JSON::XS does UTF8 decoding by default when you use the functional interface (see the documentation), so you don't need the encoding layer on your open call.
In this example I am allowing JSON::XS to decode from UTF8, and then encoding back to UTF8 when I want to print part of the data.
use strict;
use warnings;
use JSON::XS;
use Path::Tiny;
use Encode 'encode_utf8';
my $path = '~/monks/json.txt';
my $json = path($path)->slurp;
my $data = decode_json($json);
my $text = encode_utf8($data->{text});
print $text, "\n";
__END__
Hope this helps!
The way forward always starts with a minimal test.