C# 自定义转换器重写冲突解决程序

C# 自定义转换器重写冲突解决程序,c#,json.net,C#,Json.net,我正在尝试使用自定义转换器来修改所描述的对象类型,以及 所以转换器是这样的(这里什么也不做): 我是这样用的: var jsonSerializationSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; jsonSerializationSettings.Converters.Add(new MyJsonConverter()); v

我正在尝试使用自定义转换器来修改所描述的对象类型,以及

所以转换器是这样的(这里什么也不做):

我是这样用的:

var jsonSerializationSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
jsonSerializationSettings.Converters.Add(new MyJsonConverter());
var camelCaseJsonOutput = await JsonConvert.SerializeObjectAsync(myObject, Formatting.None, jsonSerializationSettings);
但是序列化的输出显示以大写开头的属性,因此使用我的转换器似乎在某种程度上取消了骆驼式契约解析器…

当您创建

JToken t = JToken.FromObject(value);
它创建未格式化的原始json。 所以,你可以用你自己的方式控制它,骆驼,帕斯卡,随便什么

例如:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    var myType = value as MyType;
    if (myType != null)
    {
        writer.WriteStartObject();
        writer.WritePropertyName("myProperty");
        serializer.Serialize(writer, myType.myProperty); // Using this will allow to serialize inner values with CamelCasePropertyNamesContractResolver
        writer.WritePropertyName("Inner");
        serializer.Serialize(writer, myType.Inner);
      ...
        writer.WriteEndObject();
    }
}
对于使用camelCase和其他属性序列化对象,我将采用这种方式(可能不是最有效的)


谢谢你有用的解释。我试图实现的是在序列化对象属于特定类型时向其添加一个特殊属性。有没有办法做到这一点(连同驼峰式外壳),而不必手动管理整个序列化,然后?编辑了带有特殊属性示例的答案
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    var myType = value as MyType;
    if (myType != null)
    {
        writer.WriteStartObject();
        writer.WritePropertyName("myProperty");
        serializer.Serialize(writer, myType.myProperty); // Using this will allow to serialize inner values with CamelCasePropertyNamesContractResolver
        writer.WritePropertyName("Inner");
        serializer.Serialize(writer, myType.Inner);
      ...
        writer.WriteEndObject();
    }
}
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteStartObject();

        writer.WritePropertyName("_custom_Prop_");
        writer.WriteValue("Custom Property value");

        WriteObjectProperties(writer, value);

        writer.WriteEndObject();
    }

    private static void WriteObjectProperties(JsonWriter writer, object value)
    {
        var myJsonWriter = new JTokenWriter();
        var js = new JsonSerializer();
        js.ContractResolver = new CamelCasePropertyNamesContractResolver();
        js.Serialize(myJsonWriter, value);
        var childTokens = myJsonWriter.Token.Children();
        foreach (var childToken in childTokens)
        {
            childToken.WriteTo(writer);
        }
    }