Desafio C#
Relatório com raw string e StringBuilder
Enunciado
Crie um programa que gere um relatório JSON a partir de uma lista de produtos. Cada produto tem nome e preço. Use StringBuilder para montar o JSON e, no final, exiba-o usando um raw string literal para mostrar o template. O JSON deve ter a estrutura: { "produtos": [ { "nome": "...", "preco": ... }, ... ] }.
Requisitos
- Definir uma lista de produtos (pode ser um array de tuplas ou classe).
- Usar
StringBuilderpara construir o JSON dinamicamente. - Exibir o JSON final usando um raw string literal (pelo menos uma vez).
- Formatar os preços com duas casas decimais usando interpolação.
Código inicial
using System;
using System.Text;
class Program
{
static void Main()
{
// Seu código aqui
}
}
Saída esperada
Relatório gerado:
{
"produtos": [
{ "nome": "Caneta", "preco": 2.50 },
{ "nome": "Caderno", "preco": 15.90 },
{ "nome": "Mochila", "preco": 89.90 }
]
}
Ver dica
Use sb.AppendLine para adicionar linhas. Para formatar preço: $"{preco:F2}". No raw string, use """ e quebras de linha reais.
Mostrar solução
using System;
using System.Text;
class Program
{
static void Main()
{
// Lista de produtos (tuplas)
var produtos = new[]
{
(Nome: "Caneta", Preco: 2.50m),
(Nome: "Caderno", Preco: 15.90m),
(Nome: "Mochila", Preco: 89.90m)
};
// Construir JSON com StringBuilder
var sb = new StringBuilder();
sb.AppendLine("{");
sb.AppendLine(" \"produtos\": [");
for (int i = 0; i < produtos.Length; i++)
{
var p = produtos[i];
string virgula = i < produtos.Length - 1 ? "," : "";
sb.AppendLine($" {{ \"nome\": \"{p.Nome}\", \"preco\": {p.Preco:F2} }}{virgula}");
}
sb.AppendLine(" ]");
sb.AppendLine("}");
// Exibir com raw string literal
string template = """
Relatório gerado:
""";
Console.WriteLine(template);
Console.WriteLine(sb.ToString());
}
}
Passo a passo
- Criamos um array de tuplas com nome e preço (usando
decimalpara valores monetários). - Iniciamos um
StringBuildere adicionamos a abertura do JSON. - Percorremos o array com um
forpara controlar a vírgula final. - Para cada produto, usamos interpolação com
{{e}}para escapar as chaves do JSON. - Formatamos o preço com
:F2para duas casas decimais. - Fechamos o JSON com
]e}. - Criamos um raw string literal (
""") para o cabeçalho, sem precisar escapar quebras de linha. - Exibimos o template e o JSON final.
Por que funciona
O StringBuilder evita a criação de múltiplas strings intermediárias, ideal para montar estruturas grandes. A interpolação com F2 formata números. O raw string literal permite escrever o texto multilinha sem escapes, mantendo a legibilidade.
Erros comuns
- Esquecer de escapar as chaves no JSON:
$"{p.Nome}"gera erro de compilação porque{e}são interpretados como interpolação. Use{{e}}. - Não usar
decimalpara dinheiro:doublepode causar imprecisão. Prefiradecimal. - Raw string literal sem indentação correta: a indentação do fechamento
"""define o recuo removido. Mantenha alinhado.
Outra forma de resolver
Use System.Text.Json para serializar a lista diretamente:
string json = System.Text.Json.JsonSerializer.Serialize(new { produtos });
É mais seguro e menos manual, mas não demonstra StringBuilder nem raw strings.
Saída esperada
Relatório gerado:
{
"produtos": [
{ "nome": "Caneta", "preco": 2.50 },
{ "nome": "Caderno", "preco": 15.90 },
{ "nome": "Mochila", "preco": 89.90 }
]
}