为什么这个匿名类型没有使用JsonConvert.DeserializeAnonymousType正确反序列化?

xai*_*oft 5 .net c# json json.net json-deserialization

我有JSON字符串:

{"response":{"token":"{\"token\":\"123\",\"id\":191}"}}
Run Code Online (Sandbox Code Playgroud)

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

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

  var deserializedToken = JsonConvert.DeserializeAnonymousType(token, def);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

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

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

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

var def = new
{
    response = new { token = "" }
};

var deserializedToken = JsonConvert.DeserializeAnonymousType(json, def);
Console.WriteLine(deserializedToken);
Run Code Online (Sandbox Code Playgroud)

然后你会最终得到:

{ response = { token = {"token":"123","id":191} } }
Run Code Online (Sandbox Code Playgroud)

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

var innerDef = new { token = "", id = "" };
var deserializedInner = JsonConvert.DeserializeAnonymousType
    (deserializedToken.response.token, innerDef);
Console.WriteLine(deserializedInner);
Run Code Online (Sandbox Code Playgroud)

然后打印:

{ token = 123, id = 191 }
Run Code Online (Sandbox Code Playgroud)