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 StringBuilder para 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

  1. Criamos um array de tuplas com nome e preço (usando decimal para valores monetários).
  2. Iniciamos um StringBuilder e adicionamos a abertura do JSON.
  3. Percorremos o array com um for para controlar a vírgula final.
  4. Para cada produto, usamos interpolação com {{ e }} para escapar as chaves do JSON.
  5. Formatamos o preço com :F2 para duas casas decimais.
  6. Fechamos o JSON com ] e }.
  7. Criamos um raw string literal (""") para o cabeçalho, sem precisar escapar quebras de linha.
  8. 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 decimal para dinheiro: double pode causar imprecisão. Prefira decimal.
  • 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 }
  ]
}