Eu até entendo que, como um exercício, pode até ser interessante tentar criar um JSON manualmente, só manipulando a string.
Mas na prática, em projetos reais, prefira usar bibliotecas prontas. Até porque um JSON é bem mais complicado e pode ter vários casos “especiais” para tratar.
Por exemplo, se o valor tiver aspas, você precisará fazer o escape com \:
// isso é um JSON válido
{ "chave": "valor \"entre aspas\" precisa do escape"}
// mas isso é um JSON inválido, porque as aspas precisam do escape
{ "chave": "valor "entre aspas" precisa do escape"}
E isso é só um dos muitos casos especiais a tratar, o formato JSON tem muito mais possibilidades.
Como é só um exercício, provavelmente querem que vc faça tudo na mão (e talvez a ideia seja exercitar o uso dos métodos da string, mais do que construir um JSON em si, sei lá). Para fins didáticos, eu entendo que pode ser interessante, mas - reforçando - em projetos reais, o melhor é usar bibliotecas prontas para tal.