在 Azure 移动应用服务后端将字符串属性反序列化为 Json 对象

Posted

技术标签:

【中文标题】在 Azure 移动应用服务后端将字符串属性反序列化为 Json 对象【英文标题】:Deserialize string Property as Json Object in Azure Modile App Service Backend 【发布时间】: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; 
    

【问题讨论】:

【参考方案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?

以上是关于在 Azure 移动应用服务后端将字符串属性反序列化为 Json 对象的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 Azure 移动服务 .Net 后端进行推送

jquery的$.ajax怎么传一个实体对象给后台呢,这个对象里有LIST类型的属性!

Azure Service Bus消息序列化/反序列化

移动应用使用 Azure *** 连接到本地后端

Azure 移动应用程序:无法从我的 nodeJS 后端发送推送通知

Azure 通知中心 - 从移动应用注册并通过应用后端发送通知