使用C#,。Net v4.0 - 给出以下结构:
public interface IInterface {...}
public class MyClass : IInterface
{
public MyClass() {}
.
.
.
}
我确实在类中定义了无参数构造函数。
收到JSON对象后,我尝试反序列化MyClass
并收到错误:
没有为此对象定义无参数构造函数
var serializer = new JavaScriptSerializer(new SimpleTypeResolver());
var newObject = serializer.Deserialize(jsonObject, myClass.GetType());
我也试过没有SimpletypeResolver()
我看到a few posts似乎徘徊在我正在寻找的东西周围,但并不完全在那里 - 除非我遗漏了什么。
MyClass
实现了一个接口,接口中不能定义默认构造函数。得到它了。那么如何反序列化MyClass
个对象?
答案 0 :(得分:3)
你需要告诉你的反序列化器想要具体的类类型来将json转换为。一种方法是在Json.Net中实现JsonConverter类。
完成人为的工作实例。
public interface IMyClass
{
void SetMyVariable(int value);
}
public class MyClass : IMyClass
{
public int MyVariable;
public MyClass()
{
MyVariable = 10;
}
public void SetMyVariable(int value)
{
this.MyVariable = value;
}
}
public class MyParentClass
{
public IMyClass IMyClass { get; set; }
}
public class MyClassConverter : JsonConverter
{
/// <inheritdoc />
public override bool CanWrite
{
get
{
return false;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotSupportedException();
}
/// <inheritdoc />
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader == null)
{
throw new ArgumentNullException("reader");
}
if (serializer == null)
{
throw new ArgumentNullException("serializer");
}
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var jsonObject = JObject.Load(reader);
var value = new MyClass();
if (value == null)
{
throw new JsonSerializationException("No object created.");
}
serializer.Populate(jsonObject.CreateReader(), value);
return value;
}
/// <inheritdoc />
public override bool CanConvert(Type objectType)
{
return typeof(IMyClass).IsAssignableFrom(objectType);
}
}
[TestClass]
public class UnitTest2
{
[TestMethod]
public void TestSerializer()
{
var myClass = new MyParentClass { IMyClass = new MyClass() };
var serializedClass = JsonConvert.SerializeObject(myClass);
var result = JsonConvert.DeserializeObject<MyParentClass>(serializedClass, new MyClassConverter());
Assert.IsNotNull(result);
}
}
答案 1 :(得分:-3)
您可以使用Newtonsoft.Json
库来序列化/反序列化.NET对象
像这样:
var jsonString = JsonConvert.SerializeObject(myObject);
var jsonObject = JsonConvert.DeserializeObject(jsonString )
为了您的方便,还有一些过载支持泛型。