serialize serializar newtonsoft jsonpropertyattribute jsonproperty jsonarrayattribute example deserialize deserializar attribute c# json json.net

newtonsoft - serializar y deserializar json c#



Json.NET serialización-cambiar el valor de la propiedad (2)

Llamar a SerializeObject hace dos cosas: crear un árbol de tokens JSON en función del objeto que especifique, y serializarlo en una cadena que contenga el JSON.

Su mejor opción sería hacer los dos pasos por separado: primero solicite a JSON.NET que le proporcione el árbol de tokens JSON, luego modifique los valores y luego serialícelos en JSON.

Desde lo alto de mi cabeza:

namespace JsonEncryptionTest { class Program { static void Main(string[] args) { var obj = new { To = "Some name", Subject = "A Subject", Content = "A content" }; var jsonObject = JObject.FromObject(obj); // modify the values. Just doing something here to amuse you. var property = jsonObject.Property("Content"); var value = (string) property.Value; property.Value = value.ToLower(); var json = jsonObject.ToString(); Console.WriteLine(json); } } }

¡Buen día!

Actualmente estoy usando el serializador Newtonsoft Json a través del siguiente código:

private string serializeAndIgnoreEmail(UserMembership obj) { var json = JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings() { ContractResolver = new DocumentIdContractResolver() }); return json; } private class DocumentIdContractResolver : CamelCasePropertyNamesContractResolver { protected override List<MemberInfo> GetSerializableMembers(Type objectType) { return base.GetSerializableMembers(objectType).Where(o => o.Name != "Email").ToList(); } }

Cada vez que necesito serializar un objeto lo llamo el método ''serializeAndIgnoreEmail''. Ahora quiero reemplazar el contenido de cada propiedad con su versión encriptada y no sé dónde hacer esto.

Mi suposición sería anular un método en ''DocumentIdContractResolver'', pero hay tantos CreateBlahBlahBlah, que me resulta muy difícil trabajar con ellos.

¿Es este el enfoque correcto para continuar modificando ContractResolver o debería probar algo más?

¡Gracias!


No he hecho exactamente lo mismo. Pero en mi caso para un proyecto API web, necesitaba serializar nombres de cadena de valores enum en lugar de sus valores numéricos. Hice un poco de investigación y me di cuenta de que los convertidores de formateadores Json están vacíos por defecto. Entonces agregué:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());

En su caso, debe escribir un JsonConverter personalizado y agregarlo a la lista de convertidores. Puedes encontrar un ejemplo similar aquí:

Convertidor personalizado Json