将 json 字符串中的布尔值转换为 int

Converting boolean to int in json string

我在, 我正在开发 C# 应用程序

我有一种情况,我从网络服务中获取一个对象,比如说

MyObject{
   public bool MyProp
}

而且我不能修改那个对象, 但我需要将 MyObject 序列化为 json 字符串,但 MyProp 必须转换为 1 或 0 而不是 true/false.

我正在使用 JavaScriptSerializer 序列化为 Json

有什么想法吗?

谢谢

如果你愿意转, you can use the solution from Convert an int to bool with Json.Net.

如果您希望继续使用 JavaScriptSerializer,您将需要为您的 MyObject 类型创建一个 JavaScriptConverter,如下所示:

class MyObjectConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get { return new[] { typeof(MyObject) }; }
    }

    // Custom conversion code below

    const string myPropName = "MyProp";

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        object value;
        if (dictionary.TryGetValue(myPropName, out value))
        {
            dictionary[myPropName] = !value.IsNullOrDefault();
        }

        var myObj = new JavaScriptSerializer().ConvertToType<MyObject>(dictionary);
        return myObj;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        var myObj = (MyObject)obj;

        // Generate a default serialization.  Is there an easier way to do this?
        var defaultSerializer = new JavaScriptSerializer();
        var dict = defaultSerializer.Deserialize<Dictionary<string, object>>(defaultSerializer.Serialize(obj));

        dict[myPropName] = myObj.MyProp ? 1 : 0;

        return dict;
    }
}

public static class ObjectExtensions
{
    public static bool IsNullOrDefault(this object value)
    {
        // Adapted from 
        if (value == null)
            return true;
        Type type = value.GetType();
        if (!type.IsValueType)
            return false; // can't be, as would be null
        if (Nullable.GetUnderlyingType(type) != null)
            return false; // ditto, Nullable<T>
        object defaultValue = Activator.CreateInstance(type); // must exist for structs
        return value.Equals(defaultValue);
    }
}

然后像这样使用它:

        var serializer = new JavaScriptSerializer();
        serializer.RegisterConverters(new JavaScriptConverter[] { new MyObjectConverter() } );

        var json = serializer.Serialize(myObject);

注意 - 即使您的 MyObject class 只有一个 属性,我编写转换器的前提是假设在现实生活中它可能具有应序列化的其他属性,并且自动反序列化,例如:

public class MyObject
{
    public bool MyProp { get; set; }

    public string SomeOtherProperty { get; set; }
}