NOTE: I have provided the solution at the bottom of this feed.
I have a C# Win 8 app where I'm de-serializing some json that looks like this:
{
'Unit': [
{
'name':'House 123',
isAvailable:'no'
},
{
'name':'House 456',
isAvailable:'yes'
}]
}
into a class that uses this interface:
public interface IUnit
{
string Name { get; }
bool isAvailable { get; }
}
But Newtonsoft throws an error:
Unexpected character encountered while parsing value: n. Path 'Unit[0].isAvailable, line 1, position 42.
Is there a way to extend Newtonsoft to parse yes/no or 1/0 based on the resulting object property type of bool? Right now it only works for true/false.
There are several posts on custom converters for classes, but not a primitive type like bool.
Any suggestions?
Newtonsoft. Json uses reflection to get constructor parameters and then tries to find closest match by name of these constructor parameters to object's properties. It also checks type of property and parameters to match. If there is no match found, then default value will be passed to this parameterized constructor.
DeserializeObject<T>(String,JsonConverter[]) Deserializes the JSON to the specified . NET type using a collection of JsonConverter. DeserializeObject(String, JsonSerializerSettings) Deserializes the JSON to a .
DeserializeObject can throw several unexpected exceptions (JsonReaderException is the one that is usually expected). These are: ArgumentException.
JSON is a format that encodes objects in a string. Serialization means to convert an object into that string, and deserialization is its inverse operation (convert string -> object).
public class MyBooleanConverter : JsonConverter
{
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var value = reader.Value;
if (value == null || String.IsNullOrWhiteSpace(value.ToString()))
{
return false;
}
if ("yes".Equals(value, StringComparison.OrdinalIgnoreCase))
{
return true;
}
return false;
}
public override bool CanConvert(Type objectType)
{
if (objectType == typeof(String) || objectType == typeof(Boolean))
{
return true;
}
return false;
}
}
public interface IUnit
{
string Name { get; }
[JsonConverter(typeof(MyBooleanConverter))]
bool isAvailable { get; }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With