Estou desenvolvendo uma API para expor alguns dados usando a API da Web do ASP.NET.
Em uma das APIs, o cliente deseja que exponha a data no yyyy-MM-dd
formato. Não quero alterar as configurações globais (por exemplo GlobalConfiguration.Configuration.Formatters.JsonFormatter
) para isso, pois é muito específico para este cliente. E desenvolvo isso em uma solução para vários clientes.
Uma das soluções que eu consegui pensar é criar um costume JsonConverter
e, em seguida, colocá-lo na propriedade de que preciso fazer a formatação personalizada
por exemplo
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Apenas imaginando se existe alguma outra maneira fácil de fazer isso.
c#
datetime
asp.net-web-api
json.net
Permaneça tolo
fonte
fonte
Respostas:
Você está no caminho certo. Como você disse que não pode modificar as configurações globais, a próxima melhor coisa a fazer é aplicar o
JsonConverter
atributo conforme necessário, conforme sugerido. Acontece que o Json.Net já possui um built-inIsoDateTimeConverter
que permite especificar o formato da data. Infelizmente, você não pode definir o formato por meio doJsonConverter
atributo, pois o único argumento do atributo é um tipo. No entanto, existe uma solução simples: subclasse the eIsoDateTimeConverter
, em seguida, especifique o formato da data no construtor da subclasse. Aplique oJsonConverter
atributo quando necessário, especificando seu conversor personalizado e você estará pronto para começar. Aqui está a totalidade do código necessário:Se você não se importa em ter tempo lá também, não precisa nem subclassificar o IsoDateTimeConverter. Seu formato de data padrão é
yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK
(como visto no código-fonte ).fonte
IsonDateTimeConverter
foi extraído diretamente do código-fonte do Json.Net ; portanto, estou revertendo sua edição nisso.Você pode usar esta abordagem:
E use-o desta maneira:
A string DateTimeFormat usa a sintaxe de string do formato .NET descrita aqui: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
fonte
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
:, significa que sua versão do json.net é muito antiga. Você precisa atualizar para a versão mais recente do json.net.Isso também pode ser feito com uma
IsoDateTimeConverter
instância, sem alterar as configurações globais de formatação:Isso usa a
JsonConvert.SerializeObject
sobrecarga que recebe umparams JsonConverter[]
argumento.fonte
Também disponível usando uma das sobrecargas das configurações do serializador:
Ou
Sobrecargas com um tipo também estão disponíveis.
fonte
yyyy-MM-ddTHH:mm:ssZ
.. 24 horas por dia.Crie uma classe auxiliar e aplique-a ao atributo de propriedade
Classe auxiliar:
Seu código usa assim:
fonte
Há outra solução que estou usando. Apenas crie uma propriedade string e use-a para json. Esta propriedade retornará a data formatada corretamente.
Dessa forma, você não precisa criar classes extras. Além disso, permite criar diferentes formatos de dados. por exemplo, você pode criar facilmente outra propriedade por hora usando o mesmo DateTime.
fonte
Algumas vezes, a decoração do atributo json convert não funcionará, por exceção dizendo que " 2010-10-01" é uma data válida . Para evitar esses tipos, removi o atributo json convert na propriedade e mencionei no método deserilizedObject como abaixo.
fonte
Com conversor abaixo
Pode usá-lo com um formato personalizado padrão
Ou qualquer formato especificado para uma propriedade
fonte