首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.NET中序列化/反序列化angular2+类型的JSON

如何在.NET中序列化/反序列化angular2+类型的JSON
EN

Stack Overflow用户
提问于 2018-05-17 15:52:23
回答 1查看 806关注 0票数 2

我从一个角度客户端调用一个.NET Web ,并使用JSON来序列化/反序列化数据。

我试图反序列化一个包含检测器列表的Model对象。检测器是一个抽象类,具有两个继承的子类: TextDetector和ColorDetector。

为了能够识别在反序列化过程中需要实例化哪种类型的检测器,我已经将TypeNameHandling.Auto设置为JsonSerializerSettings (.NET side)。

包含TextDetector的模型的典型get响应

代码语言:javascript
复制
{
  "Detectors": {
    "$type": "System.Collections.Generic.HashSet`1[[I2D_Api.Models.Detector, I2D Api]], System.Core",
    "$values": [
      {
        "$type": "I2D_Api.Models.TextDetector, I2D Api",
        "Id": 1,
        "Name": "Detector0",
        "Bounds": "0, 0, 0, 0"
      }
    ]
  },
  "Id": 1,
  "Name": "Modèle 0",
  "ImgModelLink": "https://gamewave.fr/static/images/medias/upload/Fortnite/canards/Fortnite_20180515121231.jpg"
}

但是我不喜欢这个解决方案(我甚至无法工作),因为这意味着我必须在每个客户端请求(Post或Put)上手动输入数据,才能正确地反序列化.NET端.此外,由于$前缀(但我认为这是公平的),我还没有成功地将这个JSON反序列化为一个模型对象客户端。

我想我走错了方向,我已经搜索了,但找不到其他的方式来传递这个收藏,这似乎是肮脏的方式。还有别的办法吗?

备注:我在使用EntityFramework,这是我的get方法

代码语言:javascript
复制
[ResponseType(typeof(Model))]
public IHttpActionResult GetModel(int id)
{
    Model model = db.Models.Find(id);
    if (model == null)
    {
        return NotFound();
    }

    return Ok(model);
}

编辑:所以我遵循@dbc链接:Deserializing polymorphic json classes without type information,这正是我想要的。我实现了一个Json转换器,它知道基于缺失属性Color (无颜色属性= TextDetector,颜色属性= ColorDetector)实例化子类。

还用检测器类中的X、Y、宽度和高度属性替换我的界属性(JsonProperty.ValueProvider无法提取结构上的值)(不是问题)。最后将TypeNameHandling更改为Object。

但是现在我遇到了一个堆栈溢出异常,我不明白。请注意,DetectorConverter中的TextDetector 没有比检测器错误更多的属性/属性

代码语言:javascript
复制
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    JObject item = JObject.Load(reader); // This throw stackoverflow exception
    if (item["Color"] == null)
    {
        return item.ToObject<TextDetector>();
    }
    else
    {
        return item.ToObject<ColorDetector>();
    }
}

在第一次ReadJson执行时,也不例外。但是,它看起来像JObject.load(读取器),在内部导致循环,我在堆栈中看不到,因为它是外部代码。我只知道读取器加载后的项目类型是检测器,第一次执行,然后是TextDetector,永远循环。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-18 12:34:51

感谢@dbc为我指明了正确的方向。

Deserializing polymorphic json classes without type information using json.net

接受这个链接的答案是正确的。

我想补充一些精确性:

  • 使用此解决方案,我不得不删除抽象类的struct属性,因为转换无法读取它们(我认为这是可能的,但我更愿意将struct的属性提取到abtrast类)
  • 在读取传入的Json时,可能会出现堆栈溢出异常。您可以使用serializer.populate替换JObject toItem方法来解决这个问题。或者,这就是我所做的,应用一个JSON NoConverter来具体化childs类

可以复制/粘贴并将其作为属性使用的NoConverter类,就像其他每个JsonConverter一样

代码语言:javascript
复制
public class NoConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return false;
    }

    public override bool CanRead { get { return false; } }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanWrite { get { return false; } }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50395743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档