diff --git src/wp-includes/formatting.php src/wp-includes/formatting.php
index e690948..b00e0ac 100644
--- src/wp-includes/formatting.php
+++ src/wp-includes/formatting.php
@@ -3094,6 +3094,8 @@ function wp_targeted_link_rel_callback( $matches ) {
 		$delimiter = trim( $rel_match[1] ) ? $rel_match[1] : '"';
 		$rel       = 'rel=' . $delimiter . trim( implode( ' ', $parts ) ) . $delimiter;
 		$link_html = str_replace( $rel_match[0], $rel, $link_html );
+	} elseif ( preg_match( '|target\s*=\s*?\\\\"|', $link_html ) ) {
+		$link_html .= " rel=\\\"$rel\\\"";
 	} else {
 		$link_html .= " rel=\"$rel\"";
 	}
diff --git tests/phpunit/tests/formatting/WPTargetedLinkRel.php tests/phpunit/tests/formatting/WPTargetedLinkRel.php
index 08f8ac1..56ea40c 100644
--- tests/phpunit/tests/formatting/WPTargetedLinkRel.php
+++ tests/phpunit/tests/formatting/WPTargetedLinkRel.php
@@ -101,4 +101,15 @@ class Tests_Targeted_Link_Rel extends WP_UnitTestCase {
 
 		$this->assertEquals( $expected, $post->post_content );
 	}
+
+	/**
+	 * Ensure JSON format is preserved when relation attribute (rel) is missing.
+	 *
+	 * @ticket 46316
+	 */
+	public function test_wp_targeted_link_rel_should_preserve_json() {
+		$content  = '<p>Links: <a href=\"\/\" target=\"_blank\">No rel<\/a><\/p>';
+		$expected = '<p>Links: <a href=\"\/\" target=\"_blank\" rel=\"noopener noreferrer\">No rel<\/a><\/p>';
+		$this->assertEquals( $expected, wp_targeted_link_rel( $content ) );
+	}
 }
