在 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 对象的主要内容,如果未能解决你的问题,请参考以下文章
jquery的$.ajax怎么传一个实体对象给后台呢,这个对象里有LIST类型的属性!