I need to serialize a class which it's source code cannot be changed (take this as a fact), and it's from a different assembly. It has only one constructor
public class MyObject
{
string _s;
int _i;
internal MyObject(string s, int i)
{
// ...
}
}
JsonConvert.SerializeObject(object)
fails of course because of this. I wonder if there is a way to use Json.NET to serialize this class without having to adding code or even tags to it.
If you have a parameterless constructor, you should be able to do this by adding the following setting:
JsonSerializerSettings settings = new JsonSerializerSettings()
{
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
};
var serializedJson = JsonConvert.DeserializeObject<MyObject>(jsonString, settings);
Update after question edit:
If you don't have any public
constructors and you don't have a parameterless constructor, then I only know of 2 options:
[JsonConstructor]
attribute to your internal
constructor (which doesn't seem an option in your case as you cannot edit the class).You should use a custom JsonConverter.
The solution would be something like
public class MyObjectProxy
{
public string s { get; set; }
public int i { get; set; }
}
public class MyObjectJsonConverter : JsonConverter
{
public override void WriteJson(
JsonWriter writer, object value, JsonSerializer serializer)
{
// Create an instance of MyObjectProxy, copy values from the
// instance of MyObject, write JSON from the MyObjectProxy.
}
public override object ReadJson(
JsonReader reader, Type type, object value, JsonSerializer serializer)
{
// Deserialize MyObjectProxy, create an instance of MyObject,
// copy properties from the deserialized MyObjectProxy.
}
public override bool CanConvert(Type type)
{
return typeof(MyObject).IsAssignableFrom(type);
}
}
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