You can add this to StoreBlogDataRequest:
protected function passedValidation()
{
$this->merge([
'blog' => json_decode($this->input('blog'), true),
]);
}
Make sure you add the true flag to json_decode, because the merged value has to be an array.
Since Laravel automatically validates requests when typehinted, you do not actually need the $request->safe() call, because that will get specifically the values that went into the validator, in which blog will still be a string, but you could use $request->json('blog') or $request->input('blog') to retrieve the merged value in your Controller.
Another perfectly valid option would be to add a getter to StoreBlogDataRequest like this:
public function getBlogAsArray(): array
{
return json_decode($this->safe()->input('blog'), true);
}
Then you could just use the $request->getBlogAsArray() to get the desired value. This option also works if you have turned off automatic request validation for some reason and absolutely must use the $request->safe() method. But again, if you haven't turned it off, you can just use $request->input('blog') or $request->json('blog') in the getter as well.