为啥这个匿名类型不能使用 JsonConvert.DeserializeAnonymousType 正确反序列化?

Posted

技术标签:

【中文标题】为啥这个匿名类型不能使用 JsonConvert.DeserializeAnonymousType 正确反序列化?【英文标题】:Why does this anonymous type not deserialize properly using JsonConvert.DeserializeAnonymousType?为什么这个匿名类型不能使用 JsonConvert.DeserializeAnonymousType 正确反序列化? 【发布时间】:2013-12-06 01:35:38 【问题描述】:

我有 JSON 字符串:

"response":"token":"\"token\":\"123\",\"id\":191"

然后我有以下代码来反序列化它,但它返回 null:

 var def = new
       
           token = new  token = string.Empty, id= string.Empty 
        ;

  var deserializedToken = JsonConvert.DeserializeAnonymousType(token, def);

deserializedToken 为空

这是一个更详细的示例,我无法开始工作:

var def = new
            
                code = string.Empty,
                message = string.Empty,
                url= string.Empty,
                token = new token = string.Empty
            ;

            var response = JsonConvert.DeserializeAnonymousType(data, def);

            var innerDef = new  token= string.Empty, id= string.Empty ;

            var deserializedInner = JsonConvert.DeserializeAnonymousType(response.token.token, innerDef);

【问题讨论】:

【参考方案1】:

据我所知,这里有两个问题:

您没有要反序列化的 response 属性 “token:123 id:191”部分实际上只是一个字符串——外部token属性的值

因此,如果您将代码更改为:

var def = new

    response = new  token = "" 
;

var deserializedToken = JsonConvert.DeserializeAnonymousType(json, def);
Console.WriteLine(deserializedToken);

那么你最终会得到:

 response =  token = "token":"123","id":191  

如果您也想反序列化令牌/id 部分,您可以这样做:

var innerDef = new  token = "", id = "" ;
var deserializedInner = JsonConvert.DeserializeAnonymousType
    (deserializedToken.response.token, innerDef);
Console.WriteLine(deserializedInner);

然后打印:

 token = 123, id = 191 

【讨论】:

好的,这就解释了我一直以来的内在问题。如果可以找到匹配项,我已经看到反序列化器跳过 over 属性。也许更好的说法是,我已经看到它反序列化为低于根的对象。如果我在你拥有我的那一天有更多的选票;但这对你来说可能并不重要。我敢肯定,一小时后你的票就用完了。 :D 我让它与你的那个例子一起工作,但我更详细地说明了我无法开始工作。 @xaisoft:那么 JSON 是什么?老实说,我认为这可能值得作为一个新问题提出,只是为了让一切更清楚。【参考方案2】:
string jsonToken = @"'response':'token':'token':'123','id':191";
var def = new

    response = new
    
        token = new  token = string.Empty, id = 0 
    
;

var deserializedToken = JsonConvert.DeserializeAnonymousType(jsonToken, def);

【讨论】:

以上是关于为啥这个匿名类型不能使用 JsonConvert.DeserializeAnonymousType 正确反序列化?的主要内容,如果未能解决你的问题,请参考以下文章

EF 和 [JsonIgnore]:为啥我在使用现有类型时得到空字典,但在使用匿名类型时却没有?

为啥不能将匿名方法分配给 var?

当我调用 JsonConvert.DeserializeObject() 时,为啥将 JArray 分配给 var 失败?

当其中一种数据类型可以为空而另一种不能为空时,是不是可以使用 linq 进行匿名连接? [复制]

C# 匿名类型不能分配给——它是只读的

JsonConvert.DeserializeXmlNode 异常 - 名称中不能有冒号(:)