实施自定义JsonWriter(JSON.net) [英] Implementing Custom JsonWriter (JSON.net)

查看:90
本文介绍了实施自定义JsonWriter(JSON.net)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在通过遵循此示例来实现此自定义JSON编写器

我要覆盖WriteValue方法,以便我打印Type.ToString()并隐藏项目的真实值,而不是打印json的值.

I'm overriding the WriteValue methods so that instead of printing the value of a json, I print the Type.ToString() and conceal the real value of the item.

我在使用此方法时遇到麻烦:

I'm having trouble with this method:

private void WriteValueElement(string elementName, JTokenType type)
{
    _writer.WriteStartElement(elementName);
    _writer.WriteAttributeString("type", type.ToString());
}

尤其是关于此声明_writer.WriteStartElement(elementName); 我只是不知道此WriteStartElement在哪里.此方法签名在 baseClass中不存在,但示例中也没有任何内容

And particularly with this statement _writer.WriteStartElement(elementName); I just can't figure out where this WriteStartElement is. This method signature doesn't exist in the baseClass, but also nothing in the sample

推荐答案

如果要通过将

If you want to do this by subclassing JsonTextWriter or JsonWriter, you're going to need to override all the WriteValue methods and remap the value being written. There are many methods with this name, and since Newtonsoft could in theory add new methods in later versions (for BigNumber, for instance) this could become a maintenance nuisance.

一个更简单的解决方案可能是序列化为JToken ,然后重新映射值,如下所示:

A simpler solution might be to serialize to JToken then remap the values like so:

public static class JsonExtensions
{
    public static IList<JToken> ChildrenTokenList(this JContainer container)
    {
        return container;
    }

    public static IEnumerable<JToken> DescendantsAndSelf(this JToken node)
    {
        // Small wrapper adding this method to all JToken types.
        if (node == null)
            return Enumerable.Empty<JToken>();
        var container = node as JContainer;
        if (container != null)
            return container.DescendantsAndSelf();
        else
            return new[] { node };
    }

    public static JToken MapValues(this JToken root, Func<JValue, JValue> map)
    {
        if (map == null || root == null)
            throw new ArgumentNullException();
        if (root is JValue)
            return map((JValue)root);
        else
        {
            root = root.DeepClone();
            foreach (var container in root.DescendantsAndSelf().OfType<JContainer>())
            {
                var children = container.ChildrenTokenList();
                for (int i = 0, n = children.Count; i < n; i++)
                    if (children[i] is JValue)
                        children[i] = map((JValue)children[i]);
            }
            return root;
        }
    }

    public static JToken MapValuesToValueTypes(this JToken root)
    {
        return root.MapValues(v => (v.Type == JTokenType.Null ? (JValue)null : (JValue)v.Type.ToString()));
    }
}

如果您坚持对writer进行子类化,则原型实现将如下所示:

If you insist on subclassing the writer, a prototype implementation would look like:

public class ValueTypeJsonWriter : JsonTextWriter
{
    public ValueTypeJsonWriter(TextWriter textWriter)
        : base(textWriter)
    {
    }

    private void WriteValueType(object value)
    {
        if (value == null)
            base.WriteNull();
        else
        {
            var token = JToken.FromObject(value);
            base.WriteValue(token.Type.ToString());
        }
    }

    public override void WriteValue(object value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(bool value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(bool? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(byte value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(byte? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(byte[] value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(char value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(char? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(DateTime value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(DateTime? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(DateTimeOffset value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(DateTimeOffset? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(decimal value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(decimal? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(double value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(double? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(float value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(float? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(Guid value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(Guid? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(int value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(int? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(long value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(long? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(sbyte value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(sbyte? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(short value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(short? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(string value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(TimeSpan value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(TimeSpan? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(uint value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(uint? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(ulong value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(ulong? value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(Uri value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(ushort value)
    {
        WriteValueType(value);
    }

    public override void WriteValue(ushort? value)
    {
        WriteValueType(value);
    }
}

原型小提琴.

这篇关于实施自定义JsonWriter(JSON.net)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆