我正在尝试建立一个读取器,它将从各种网站中获取JSON对象(想想信息抓取)并将它们转换为C#对象.我目前正在使用JSON.NET进行反序列化过程.我遇到的问题是它不知道如何处理类中的接口级属性.所以有些本质:
public IThingy Thing
Run Code Online (Sandbox Code Playgroud)
会产生错误:
无法创建IThingy类型的实例.Type是接口或抽象类,无法实例化.
让它成为ITINGy而不是Thingy是相对重要的,因为我正在处理的代码被认为是敏感的,单元测试非常重要.对于像Thingy这样的完全成熟的对象,不可能对原子测试脚本的对象进行模拟.它们必须是一个接口.
我一直在研究JSON.NET的文档已有一段时间了,我在这个网站上找到的与此相关的问题都来自一年多以前.有帮助吗?
此外,如果重要,我的应用程序是用.NET 4.0编写的.
在这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.
我在反序列化我的对象时遇到问题。它包含以下属性:
public List<IShape> Shapes { get; set; };
Run Code Online (Sandbox Code Playgroud)
JSON.NET 反序列化器总是告诉我,不可能实例化接口。
我有几个实现 IShape 接口的类,例如Polyline -> IPolyline -> IShape。我已经尝试了两种解决方案:
但我得到了同样的异常,即 IShape 无法实例化,被抛出。
TypeNameHandling.Auto我用,序列化对象TypeNameHandling.All也没有帮助,即使我使用上面链接的帖子中提到的转换器也是如此。
有谁知道这个问题的解决方案?如果需要一些代码,我很乐意发布它。
以下是生成的 JSON 示例。
"$type": "SketchModel.Layer, SketchModel",
"Id": 57865477,
"Shapes": {
"$type": "System.Collections.Generic.List`1[[SketchModel.Shapes.AbstractShapes.IShape, SketchModel]], mscorlib",
"$values": [
{
"$type": "SketchModel.Shapes.Polyline, SketchModel",
Run Code Online (Sandbox Code Playgroud)
该行负责解决这个问题:
"System.Collections.Generic.List`1[[SketchModel.Shapes.AbstractShapes.IShape, SketchModel]], mscorlib"
Run Code Online (Sandbox Code Playgroud)
它根本不知道如何实例化 IShape。如果我创建一个自定义转换器并让它为每个 IShape 返回一条折线,它可以工作,但不会创建任何其他形状(例如椭圆)。
在
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)自定义转换器中重写的方法中,如果我让我打印 objectType 的完整类型名称,它始终是 IShape,而不是其他任何内容......
我有一些对象:
public class MyObject
{
public MyField Field { get; set; }
}
public class MyField
{
[JsonProperty]
public Entity MyEntity { get; set; }
public IEntity IMyEntity { get; set; }
}
public interface IEntity
{
string MyStr { get; }
}
public class Entity : IEntity
{
}
Run Code Online (Sandbox Code Playgroud)
然后我正在尝试做类似的事情
JsonConvert.DeserializeObject<MyObject>(myObjStr);
Run Code Online (Sandbox Code Playgroud)
这会引发类似于
无法创建 MyObject 类型的实例...类型是接口或抽象类,无法实例化。路径“MyField.IMyEntity.MyInt”
我无法更改字段或实体,因为它在另一个组的代码库中。MyObject 类是我的。有没有办法反序列化这个对象?我在JSON.NET 中使用 JsonSerializerSettings 尝试了一些方法- 如何反序列化接口实例的集合?但无济于事。
我有一个JSON响应,包含在外部数组中,如下所示:
[
{
"type": "a"
},
{
"type": "b",
"id": 1
},
{
"type": "c",
"name": "somename"
}
]
Run Code Online (Sandbox Code Playgroud)
我试图将此转换为对象,如下所示:
class LoginOptions
{
public IList<ILoginOption> Options { get; set; }
}
interface ILoginOption
{
[JsonProperty("type")]
LoginType LoginType { get; }
}
class LoginOptionA : ILoginOption{
public LoginType LoginType
{
get { return LoginType.A; }
}
}
class LoginOptionB : ILoginOption{
public LoginType LoginType
{
get { return LoginType.B; }
}
[JsonProperty("id")]
public int Id { get; set; }
}
class …Run Code Online (Sandbox Code Playgroud)