【发布时间】:2021-10-05 12:56:25
【问题描述】:
我有这样的课
public class A{
public Guid userId { get; set; }
public Guid businessId { get; set; }
public Dictionary<int, long> rights { get; set; }
}
我想把这个json转换成这个类
{
"userId": "dc2af693-72e1-49a7-80aa-6416c6536bdf",
"businessId": "0110eea4-7a47-4a7c-95ea-10547ab49652",
"rights": "{\"19\":1,\"17\":15,\"18\":1,\"23\":1,\"1\":31,\"20\":3,\"3\":1,\"16\":0}",
}
但是当我尝试用 NewtonSoft.Json 转换它时
JsonConvert.DeserializeObject<A>(json);
我收到以下错误无法将 System.string 转换为 System.Dictionary
"{"19":1, "17":15, "18":1, ..., "16":0}"
如果我再次反序列化这个字符串,它会按照我的意愿工作,是否有更好的方法来做到这一点。
【问题讨论】:
-
其实“rights”的内容是一个字符串,因为所有的引号都被反斜杠(\")转义了
-
您是否尝试过创建示例对象并首先对其进行序列化以查看序列化后的样子?我发现这是在构建复杂字符串时发现一些更容易遗漏的错误的好方法。
-
rights中的数据实际上是字典的 Json 表示,因此这可能是一个两步过程:首先将rights反序列化为字符串,然后再将其反序列化为字典:Dictionary<int, long> RightValues => JsonConvert.DeserializeObject<Dictionary<int, long>>(rights); -
@CMGeek 此 json 是 jwt 令牌的有效负载,其中所有内容都作为对令牌用户的声明添加。
-
您需要使用自定义 JsonConverter 来装饰
rights属性 - 在自定义JsonConverter中,您将能够反序列化字符串,然后将其转换为字典。跨度>
标签: c# asp.net-core json.net