Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

JSON

Olá!

Alguém sabe como eu formato as casas decimais em arquivos JSON?

Quando eu gravo um arquivo JSON em C# usando o StreamWriter e pego um decimal digitado pelo usuário, tipo 57.00, ele grava "Preco":5700.0.

Se eu passar o decimal na mão, ele grava certo colocando o M, tipo 57M = 57.0, mas se eu usar o Console.ReadLine() para deixar o usuário entrar com o valor ele grava erro.

Alguém sabe com eu posso formatar para de repente incluir esse M dentro do método? Este é o método usado:

public void ExportarJson(Produto p)
{
    StreamWriter sw = new StreamWriter("c:\\temp\\produto.json", true);
    sw.WriteLine(JsonConvert.SerializeObject(p));
    sw.Close();
}

Obrigada desde já =)

4 respostas

Olá Luana, tudo bem?

Tem como mandar sua classe Produto para que eu possa tentar reproduzir ?

Classe Produto

namespace Projeto2.Entidades
{
    public class Produto
    {
        #region Encapsulamento
            public int IdProduto { get; set; }
            public string Nome { get; set; }
            public decimal Preco { get; set; }
            public int Quantidade { get; set; }
        #endregion

        #region Contrutores
            public Produto()
            {

            }

            public Produto(int idProduto, string nome, decimal preco, int quantidade)
            {
                this.IdProduto = idProduto;
                this.Nome = nome;
                this.Preco = preco;
                this.Quantidade = quantidade;
            }
        #endregion
    }
}
solução!

Oi Luana

Você vai ter de criar um conversor para fazer isso:

class DecimalConverter : JsonConverter

E sobreescrever os métodos apropriados para formatar do jeito que voce quer (talvez fazer um if para converter só quando é determinado nome do campo)

Aí registre-o na sua lista de conversores:

JsonSerializerSettings settings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    MissingMemberHandling = MissingMemberHandling.Ignore,
    Formatting = Formatting.None,
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    Converters = new List<JsonConverter> { new DecimalConverter() }
};

Olá Paulo,

Primeiro muito obrigada pela ajuda.

Então, tentei fazer isso que você sugeriu. Quando eu herdei o JsonConverter e implementei os métodos obrigatórios, alterei o CanConvert:

public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(decimal));
        }

Mas o métodos ReadJson e WriteJson eu não sabia muito o que fazer. Peguei algumas coisas no internet, mas ficou dando erro (Exception of type 'System.StackOverflowException' was thrown.)

Como ainda tenho muita dificuldade com JSON e tinha que entregar ontem, tive que fazer uma "pequena gambiarra" usando o Replace:

public static decimal LerPrecoProduto()
            {
                 Console.WriteLine("Digite o Preço do Produto: ");
                 var v = Convert.ToDecimal(Console.ReadLine().Replace(".", ","));
                 return Convert.ToDecimal(v); 
            }

Como ele está pegando o padrão brasileiro e obriguei ele a trocar o ponto pela vírgula e assim ele grava o ponto na casa decimal certa.

Só pra você entender, o programa vai ser usado por americanos, mas o SO está em português nessas máquinas e não se pode trocar o idioma das máquinas. É um projeto console. Então o que eu queria era que o executável ignorasse o idioma do SO e usasse a cultura en-US, para assim permitir ao usuário entrar com os dados no formato do país dele.

Tentei usar o CultureInfo:

CultureInfo ci = CultureInfo.CreateSpecificCulture("en-US");
p.Preco.ToString("C", ci);

Tentei mudar o cultura no AppConfig:

<add key="CMSDefaultUICulture" value="en-US" />
 <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" />

Mas nada funcionou! Então usei o Replace e entreguei desse jeito meio GoHorse mesmo, mas não era o ideal =/

Muito obrigada novamente =)