Вие тълкувате погрешно това, което браузърът ви показва. Не забравяйте, че JSON по същество е обикновен текст, но вашият браузър се опитва да го покаже като HTML. \n chars НЕ се зачитат от дисплеи в HTML режим и те ще обвият текста в първия подходящ знак за интервал. JSON може перфектно да запази \n символи вътре в своите низове без никакви проблеми.
Най-вероятно вашият <br> идва грешка от <br> вмъкване, което правите във вашия preg_replace обадете се, защото НЯМА <br> тагове в оригиналния JSON. С други думи, вие причинявате същата грешка, която се опитвате да поправите, като се опитвате да поправите грешката, която не би съществувала, ако не се опитвате да я поправите.