您好!
我目前正在通过以下代码使用Newtonsoft Json序列化程序:
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();
}
}
每次我需要序列化一个对象时,我都会调用"serializeAndIgnoreEmail"方法。我现在想用加密版本替换每个属性的内容,但我不知道在哪里可以这样做。
我的猜测是覆盖"DocumentIdContractResolver"中的一个方法,但CreateBlahBlahBlah方法太多了,我发现很难使用它们。
这是继续修改ContractResolver的正确方法吗?还是我应该尝试其他方法?
谢谢!
调用SerializeObject
有两件事:根据指定的对象创建一个JSON令牌树,并将其序列化为包含JSON的字符串。
最好分别执行两个步骤:首先让JSON.NET为您提供JSON令牌树,然后修改值,然后将它们序列化为JSON。
从我的头顶:
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);
}
}
}
我没有做完全相同的事情。但在我的web API项目中,我需要序列化枚举值的字符串名称,而不是它们的数值。我做了一些研究,发现Json格式化程序转换器在默认情况下是空的。所以我补充道:
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
在您的情况下,您需要编写一个自定义JsonConverter,并将其添加到转换器列表中。你可以在这里找到一个类似的例子:
自定义Json转换器