Non ho visto molte informazioni su Json.NET che supporta la deserializzazione degli oggetti con i campi readonly
. Osservo che gli attributi .NET DataContract e DataMember consentono di compilare i campi readonly
durante la deserializzazione, ma Json.NET non sembra supportarlo, almeno dal comportamento che sto vedendo.Json.NET può popolare campi di sola lettura in una classe?
risposta
afai può vedere cambiare un campo in readonly
risultati in un valore null
dopo la deserializzazione. Ho avuto un esempio funzionante per un'altra domanda (modificata come mostrato sotto), e questo è il comportamento che vedo.
public class NameAndId
{
public string name;
public int id;
}
public class Data
{
public NameAndId[] data;
}
public class Target
{
public string id;
public readonly NameAndId from;
public DateTime updated_time;
public readonly string message;
public Data likes;
}
public class Program
{
static void Main(string[] args)
{
string json = File.ReadAllText(@"c:\temp\json.txt");
Target newTarget = JsonConvert.DeserializeObject<Target>(json);
}
}
Non è la soluzione più elegante, ma è possibile estendere il DefaultConstractResolver per farlo:
public class ContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.Writable = CanSetMemberValue(member, true);
return property;
}
public static bool CanSetMemberValue(MemberInfo member, bool nonPublic)
{
switch (member.MemberType)
{
case MemberTypes.Field:
var fieldInfo = (FieldInfo)member;
return nonPublic || fieldInfo.IsPublic;
case MemberTypes.Property:
var propertyInfo = (PropertyInfo)member;
if (!propertyInfo.CanWrite)
return false;
if (nonPublic)
return true;
return (propertyInfo.GetSetMethod(nonPublic) != null);
default:
return false;
}
}
}
Ho solo rimuovere un po 'di controllo dal metodo CanSetMemberValue. Sfortunatamente non è né virtuale né un metodo di istanza, quindi ho dovuto scavalcare anche CreateProperty.
Questo può essere fatto ora. Dichiarare le proprietà utilizzando l'attributo JsonProperty
, e garantire che essi hanno una serie protetta dichiarato:
[JsonProperty("Name")] public string Name {get; protected set;}
Questo non ha funzionato per me quando si utilizza solo un get
, ma funziona perfettamente con il protected set
.
- 1. JAXB può creare una proprietà di classe 'sola lettura'?
- 2. Campi di sola lettura nel formato django
- 3. Crea una sola tabella in mysql di sola lettura
- 4. sola lettura vs auto (sola lettura) Proprietà
- 5. admin Django - rende tutti i campi in sola lettura
- 6. Modello intero in sola lettura
- 7. Campi di sola lettura nel django admin/inline
- 8. Come per allineare le etichette e campi di sola lettura in una forma di 2 Bootstrap
- 9. : Creare una parte di sola lettura
- 10. Apri file di sola lettura
- 11. Scrittura in una sessione di sola lettura in MVC 3+
- 12. Canale di sola lettura Canale
- 13. Come rappresentare una proprietà di sola lettura in un'API REST
- 14. NHibernate Linq in modalità di sola lettura
- 15. Produzione di una copia di sola lettura di una classe, howto
- 16. Swift di sola lettura esterna, proprietà di lettura interna
- 17. DataGridView celle di sola lettura
- 18. proprietà di sola lettura in PHP?
- 19. "Sola lettura" Proprietà Accessor in C#
- 20. Proprietà di sola lettura OData
- 21. sola lettura attribuiscono alternare
- 22. Come posso dire a ReSharper di interrompere la creazione di campi di sola lettura?
- 23. Proprietà di sola lettura in Objective-C?
- 24. Django unittest test database di sola lettura
- 25. Come rendere dizionario di sola lettura in Python
- 26. Stubing di una proprietà di sola lettura con Rhino Mocks
- 27. Json.NET Serializzare i membri privati e non le proprietà di sola lettura
- 28. Come creare una variabile di sola lettura locale in bash?
- 29. Come creare una tabella di sola lettura in SQL Server?
- 30. Come implementare una variabile membro di sola lettura in PHP?
Sì, è lo stesso comportamento che vedo. Sfortunatamente, questo insieme alle restrizioni del costruttore sugli oggetti serializzati è per me il rompicapo di Json.NET. :( –
La mia ipotesi è che le classi incorporate .Net abbiano accesso privilegiato a quei campi che non sono disponibili per la libreria di terze parti. –
Non è diverso dall'impostare qualsiasi altro campo con il riflesso, quindi è fattibile e ho archiviato un richiesta di funzionalità sul tracker di errori Json.NET – asgerhallas