相关疑难解决方法(0)

在JSON.NET中为反序列化转换接口

我正在尝试建立一个读取器,它将从各种网站中获取JSON对象(想想信息抓取)并将它们转换为C#对象.我目前正在使用JSON.NET进行反序列化过程.我遇到的问题是它不知道如何处理类中的接口级属性.所以有些本质:

public IThingy Thing
Run Code Online (Sandbox Code Playgroud)

会产生错误:

无法创建IThingy类型的实例.Type是接口或抽象类,无法实例化.

让它成为ITINGy而不是Thingy是相对重要的,因为我正在处理的代码被认为是敏感的,单元测试非常重要.对于像Thingy这样的完全成熟的对象,不可能对原子测试脚本的对象进行模拟.它们必须是一个接口.

我一直在研究JSON.NET的文档已有一段时间了,我在这个网站上找到的与此相关的问题都来自一年多以前.有帮助吗?

此外,如果重要,我的应用程序是用.NET 4.0编写的.

.net c# json json.net

116
推荐指数
10
解决办法
11万
查看次数

Newtonsoft Json中的TypeNameHandling警告

这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.

c# serialization json.net

20
推荐指数
2
解决办法
7842
查看次数

JSON.NET:反序列化包含从接口派生的对象列表的类

我在反序列化我的对象时遇到问题。它包含以下属性:

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,而不是其他任何内容......

c# json.net deserialization

6
推荐指数
1
解决办法
9437
查看次数

C# Json.Deserialize with Object with Child class with interfaces

我有一些对象:

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 尝试了一些方法- 如何反序列化接口实例的集合?但无济于事。

c# json

5
推荐指数
1
解决办法
1112
查看次数

反序列化子类中的匿名顶级数组

我有一个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)

c# json json.net

3
推荐指数
1
解决办法
1326
查看次数

标签 统计

c# ×5

json.net ×4

json ×3

.net ×1

deserialization ×1

serialization ×1