C# 实现自定义JsonWriter(JSON.net)

C# 实现自定义JsonWriter(JSON.net),c#,.net,json,json.net,C#,.net,Json,Json.net,我一直在通过以下方式在自定义JSON编写器中实现此功能 我正在重写WriteValue方法,这样就不用打印json的值,而是打印Type.ToString()并隐藏项的实际值 我在使用此方法时遇到问题: private void WriteValueElement(string elementName, JTokenType type) { _writer.WriteStartElement(elementName); _writer.WriteAttributeString("

我一直在通过以下方式在自定义JSON编写器中实现此功能

我正在重写
WriteValue
方法,这样就不用打印json的值,而是打印
Type.ToString()
并隐藏项的实际值

我在使用此方法时遇到问题:

private void WriteValueElement(string elementName, JTokenType type)
{
    _writer.WriteStartElement(elementName);
    _writer.WriteAttributeString("type", type.ToString());
}
尤其是这条语句
\u writer.writeStarteElement(elementName);

我就是想不出这个WriteStart元素在哪里。此方法签名在中不存在,但在示例中也不存在。如果要通过子类化或,则需要重写所有方法并重新映射正在写入的值。有许多使用此名称的方法,由于Newtonsoft理论上可以在更高版本中添加新方法(例如,对于
BigNumber
),这可能会成为维护麻烦

一个更简单的解决方案可能是重新映射值,如下所示:

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()));
    }
}

原型。

在您链接的示例中,
\u writer
是一个示例(参见示例的第3行)。写入XML元素的开始标记。在子类化和报告之前,我将尝试重新映射这些值。谢谢你的帮助!
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);
    }
}