7

再会!

我目前正在通过以下代码使用 Newtonsoft Json Serializer:

        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 的正确方法还是我应该尝试其他方法?

谢谢!

4

2 回答 2

8

调用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);
        }
    }
}
于 2013-08-08T11:06:09.017 回答
1

我没有做过完全相同的事情。但在我的 Web API 项目中,我需要序列化枚举值的字符串名称而不是它们的数值。我做了一些研究,并意识到 Json 格式化程序转换器默认为空。所以我补充说:

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

在您的情况下,您需要编写一个自定义 JsonConverter 并将其添加到转换器列表中。你可以在这里找到一个类似的例子:

自定义 Json 转换器

于 2013-10-16T06:04:04.283 回答