Eu sei que há um atributo para lidar com setters privados, mas eu meio que quero esse comportamento como padrão. Existe uma maneira de fazer isso? Exceto ajustar a fonte. Seria ótimo se houvesse uma configuração para isso.
Vim aqui procurando o atributo real que faz o Json.NET preencher uma propriedade somente leitura ao desserializar, e isso é simplesmente [JsonProperty], por exemplo:
Em seguida, basta usar qualquer um dos resolvedores:
var settings =newJsonSerializerSettings{ContractResolver=newPrivateSetterContractResolver()};var model =JsonConvert.DeserializeObject<Model>(json, settings);
A opção de serialização padrão oferece suporte a todos os tipos de membros da classe. Portanto, esta solução retornará todos os tipos de membros privados, incluindo campos. Só estou interessado em também oferecer suporte a setters privados.
Alt2: Crie um ContractResolver personalizado:
Portanto, esta é a melhor opção, já que apenas verificamos as propriedades.
Parece que Alt 2 é definitivamente o caminho a percorrer hoje em dia. DefaultMembersSearchFlagsfoi descontinuado .
Todd Menier
4
Com c # 6, {get; }NÃO é equivalente a { get; private set; }. Para o primeiro caminho property.GetSetMethod(true)retorna nulle o último true. Isso me surpreendeu. Você deve ter private set;para que a desserialização funcione conforme o esperado.
A resposta de @Daniel (Alt2) está correta, mas eu precisava que isso funcionasse para setters e getters privados (estou trabalhando com uma API que, na verdade, tem algumas coisas somente para gravação, como user.password .) Aqui está o que eu terminei:
Respostas:
Vim aqui procurando o atributo real que faz o Json.NET preencher uma propriedade somente leitura ao desserializar, e isso é simplesmente
[JsonProperty]
, por exemplo:Solução alternativa
Basta fornecer um construtor que tenha um parâmetro que corresponda à sua propriedade:
Agora isso funciona:
Prefiro essa abordagem sempre que possível, pois:
{ get; private set; }
e justo{ get; }
.fonte
{get;private set;}
, não com{get;}
{ get; }
se o tipo tiver um construtor com um parâmetro correspondente ao nome da propriedade.Atualizado, nova resposta
Eu escrevi um NuGet de distribuição de origem para isso, que instala um único arquivo com dois resolvedores de contrato personalizados:
Instale o NuGet:
Em seguida, basta usar qualquer um dos resolvedores:
Você pode ler sobre isso aqui: http://danielwertheim.se/json-net-private-setters-nuget/
Repo do GitHub: https://github.com/danielwertheim/jsonnet-privatesetterscontractresolvers
Resposta antiga (ainda válida)
Existem duas alternativas que podem resolver o problema.
Alt 1: nos desserializadores
A opção de serialização padrão oferece suporte a todos os tipos de membros da classe. Portanto, esta solução retornará todos os tipos de membros privados, incluindo campos. Só estou interessado em também oferecer suporte a setters privados.
Alt2: Crie um ContractResolver personalizado:
Portanto, esta é a melhor opção, já que apenas verificamos as propriedades.
Para obter mais informações, leia minha postagem: http://danielwertheim.se/json-net-private-setters/
fonte
DefaultMembersSearchFlags
foi descontinuado .{get; }
NÃO é equivalente a{ get; private set; }
. Para o primeiro caminhoproperty.GetSetMethod(true)
retornanull
e o últimotrue
. Isso me surpreendeu. Você deve terprivate set;
para que a desserialização funcione conforme o esperado.A resposta de @Daniel (Alt2) está correta, mas eu precisava que isso funcionasse para setters e getters privados (estou trabalhando com uma API que, na verdade, tem algumas coisas somente para gravação, como
user.password
.) Aqui está o que eu terminei:Registrado assim:
fonte