DJPB
DJPB

Reputation: 5819

Converting boolean to int in json string

I there, I'm working on a c# application

I Have a situation where i get an object from a web service, say

MyObject{
   public bool MyProp
}

And I can't modify that object, but i need to serialize MyObject to a json string but MyProp has to be converted to 1 or 0 instead of true/false.

I'm using JavaScriptSerializer to serialize to Json

Any idea?

tks

Upvotes: 2

Views: 3851

Answers (1)

dbc
dbc

Reputation: 117015

If you are willing to switch to , you can use the solution from Convert an int to bool with Json.Net.

If you wish to continue using JavaScriptSerializer, you will need to create a JavaScriptConverter for your MyObject type as follows:

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 https://stackoverflow.com/questions/6553183/check-to-see-if-a-given-object-reference-or-value-type-is-equal-to-its-default
        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);
    }
}

Then use it like:

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

        var json = serializer.Serialize(myObject);

Note - even though your MyObject class only has one property, I wrote the converter under the assumption that in real life it could have additional properties that should be serialized and deserialized automatically, for instance:

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

    public string SomeOtherProperty { get; set; }
}

Upvotes: 3

Related Questions