【问题标题】:Deserialize string Property as Json Object in Azure Modile App Service Backend在 Azure 移动应用服务后端将字符串属性反序列化为 Json 对象
【发布时间】:2020-09-30 06:57:04
【问题描述】:

我遇到了与here 发布的类似问题 除了我使用的是 Azure 移动应用服务后端。 我将 json 字符串存储在 sql 数据库中,我需要应用服务将其反序列化为对象类型。

目前来自 Azure 移动应用服务 Get 的 Json 如下所示: (这不是代码内格式,它实际上是以这种方式格式化 json)

{"deleted": false,"updatedAt": "2020-06-09T16:30:48.09Z","createdAt": "2020-06-03T04:34:41.617Z","version": "AAAAAABXrYA=","id": "DBEC6DE9-3C5C-47C5-8404-67C79FCF6740","equipmentSpeakerTapValue": "{\"value\": 0.0,\"wattage\": 0,\"direct\": false}"}

equipmentSpeakerTapValue 显示为字符串而非 json 嵌套对象

我需要 Json 看起来像这样:

{"deleted": false,"updatedAt": "2020-06-09T16:30:48.09Z","createdAt": "2020-06-03T04:34:41.617Z","version": "AAAAAABXrYA=","id": "DBEC6DE9-3C5C-47C5-8404-67C79FCF6740","equipmentSpeakerTapValue":{"Value":2.5,"Wattage":70,"Direct":false}"}

由于我使用的是 Azure 移动应用服务,我不知道问题出在实体框架还是 Json 序列化/反序列化。我也不知道如何更改它,因为 Azure 移动应用服务是一个包装器,因此您无法正常执行操作。

这是我的 EF 对象模型和我需要将字符串属性反序列化为的模型:

public class SiteEquipment
    {
        public string Id { get; set; }
        public byte[] Version { get; set; }
        public DateTimeOffset? CreatedAt { get; set; }
        public DateTimeOffset? UpdatedAt { get; set; }
        public bool Deleted { get; set; }

        //I don't know which EquipmentSpeakerTapValue to use:

        //string version that serializes to: "equipmentSpeakerTapValue": "{\"value\": 0.0,\"wattage\": 0,\"direct\": false}"
        public string EquipmentSpeakerTapValue { get; set; }

        //object version that should serialize to: "equipmentSpeakerTapValue":{"Value":2.5,"Wattage":70,"Direct":false}"
        public TapValue EquipmentSpeakerTapValue { get; set; }
    }

    public class TapValue
    {
        public double Value { get; set; }
        public int Wattage { get; set; }
        public bool Direct { get; set; }
    }

【问题讨论】:

    标签: c# json entity-framework azure-mobile-services


    【解决方案1】:

    抱歉,我还不能发表评论。

    我注意到在您的第二个字符串中,您仅将 json 中的最后 3 个“项目”大写。你不在乎前面有没有封顶吗?

    上面的字符串

    {"deleted": false,"updatedAt": "2020-06-09T16:30:48.09Z","createdAt": "2020-06- 03T04:34:41.617Z","version": "AAAAAABXrYA=","Id": "DBEC6DE9-3C5C-47C5-8404-67C79FCF6740","equipmentSpeakerTapValue":{"Value":2.5,"Wattage":70,"Direct":false}"}

    验证问题字符串

    {"Deleted": false,"UpdatedAt": "2020-06-09T16:30:48.09Z","CreatedAt": "2020-06-03T04:34:41.617Z","Version": "AAAAAABXrYA=","id": "DBEC6DE9-3C5C-47C5-8404-67C79FCF6740","EquipmentSpeakerTapValue":{"Value":2.5,"Wattage":70,"Direct":false}"}

    我实际上对您的第一个值感到惊讶,例如 updatedAt 得到正确反序列化。

    我要做的是在您的类定义中,添加 JsonProperty 属性,以便 json 知道反序列化非支持参数(例如 Wattage 没有私有 wattage 属性)

    所以说

    public class TapValue
    {
        [JsonProperty("value")]
        public double Value { get; set; }
    
        [JsonProperty("wattage")]
        public int Wattage { get; set; }
    
        [JsonProperty("direct")]
        public bool Direct { get; set; }
    }
    

    您在使用 Newtonsoft 吗?因为上面会告诉它将小写版本映射到大写版本。或者如果你有 MyValueHere,你可能在 json 中有 myValueHere,所以让你的 jsonproperty 值为 myValueHere,它将映射到 MyValueHere

    【讨论】:

    • 您说您还不能发表评论,但后来您做到了……这些是 AMAS 要求的默认列,您无法更改它们。该服务忽略了所有属性,否则我不会发布这个问题。它做它想做的事,我无法更改 Json 设置。
    • 是的,我的意思是我不能添加 cmets(不能添加到您的原始帖子中),必须有 50 分)。我只能发布答案,然后对我自己的答案进行 cmets。您是否有权访问数据库以查看其是否以这种方式实际存储?但是,据我所知,您的问题是我使用字符串还是使用对象,将是字符串版本。但仅基于您在服务中所显示的内容。有趣的是数据库中的内容。您是如何构建 EF 模型的(直接来自数据库?)?您是否从 DB 执行 Code First?
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2017-05-03
    • 2013-07-09
    • 1970-01-01
    • 2020-02-22
    • 2021-01-16
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多