2013-11-21 38 views
3

我有JSON字符串:为什么使用JsonConvert.DeserializeAnonymousType这个匿名类型不能反序列化?

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

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

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); 

回答

7

有两个问题在这里,只要我可以告诉:

  • 你没有response属性反序列化
  • 的“令牌:123 ID:191”部分实际上只是一个字符串 - 中

    var def = new 
    { 
        response = new { token = "" } 
    }; 
    
    var deserializedToken = JsonConvert.DeserializeAnonymousType(json, def); 
    Console.WriteLine(deserializedToken); 
    

    ,那么你就结了:外token财产

所以,如果你改变你的代码的价值

{ 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 } 
+0

好了,这样解释了内在化问题我一直都有。如果可以找到匹配的话,我已经看到反序列化器跳过*属性。也许更好地说,我已经看到它反序列化成比根低的对象。如果我有更多的选票,那么你有我的一天;但这对你来说可能并不重要。我敢肯定,你在一小时内没有投票权。 :D –

+0

我把它用于你的例子,但是我更详细地说明了我无法工作。 – xaisoft

+1

@xaisoft:那么JSON是什么呢?说实话,我认为这可能值得作为一个新问题提出,只是为了让一切更清楚。 –

相关问题