JSON.NET来反序列化动态对象



我有JSON数据:

var decodedJson =
"{{
  "user": {
    "userId": "sid:C4F4E93856104F078A11FE95892F0158"
  },
  "authenticationToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmdWxscm93IjoiYWxsIiwiRGJnMiI6ImxvZ2luIiwidmVyIjoiMyIsInVpZCI6InNpZDpDNEY0RTkzODU2MTA0RjA3OEExMUZFOTU4OTJGMDE1OCIsImlzcyI6InVybjptaWNyb3NvZnQ6d2luZG93cy1henVyZTp6dW1vIiwiYXVkIjoidXJuOm1pY3Jvc29mdDp3aW5kb3dzLWF6dXJlOnp1bW8iLCJleHAiOjE0NDk3NTYzNzIsIm5iZiI6MTQ0NzE2NDM3Mn0.kc-0O_aorfTw9l9U6yY6wyVtQnckqNBJikBzxAcJZ_U"
}}";

然后我想使用JSON.NET:动态反序列化它

var result = JsonConvert.DeserializeObject<dynamic>(decodedJson);

然后我希望提取UserId和Token,如下所示:

string userId = result.user.userId;
string userToken = result.authenticationToken;

但它说

"未知成员用户/authenticationToken"

有什么想法吗?


更新:

我复制了错误的json数据,它实际上应该是这样的:

{"user":{"userId":"sid:C4F4E93856104F078A11FE95892F0158"},"authenticationToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmdWxscm93IjoiYWxsIiwiRGJnMiI6ImxvZ2luIiwidmVyIjoiMyIsInVpZCI6InNpZDpDNEY0RTkzODU2MTA0RjA3OEExMUZFOTU4OTJGMDE1OCIsImlzcyI6InVybjptaWNyb3NvZnQ6d2luZG93cy1henVyZTp6dW1vIiwiYXVkIjoidXJuOm1pY3Jvc29mdDp3aW5kb3dzLWF6dXJlOnp1bW8iLCJleHAiOjE0NDk3NjE1NDEsIm5iZiI6MTQ0NzE2OTU0MX0.oVH8R2134UQQDpXfzPv2mmrj7M05w2mzWtbp70i7GEU"}

从长远来看,最好准确地复制C#中的结构。如果您的模型更改为json,那么您无论如何都必须更改dynamic代码,错误更容易爬进来。

在删除响应开始和结束处的额外{}之后,可以使用以下类来解析json。

public class User
{
    public string userId { get; set; }
}
public class RootObject
{
    public User user { get; set; }
    public string authenticationToken { get; set; }
}

您可以使用以下网站将JSON快速映射到CSharp

http://json2csharp.com/

在JSON字符串中的整个对象周围似乎有一组额外的大括号"{}"。你试过把它们取下来看看是否有效吗?

我把你的JSON字符串粘贴到一些基于web的JSON格式化程序中,它们都会抛出错误,直到我删除了最外面的大括号。

一种方法是像这个一样使用Json.NETLinq-to-JSON

var jsonString = File.ReadAllText(@"C:YourDirectoryuser.json");
var jObjet = JObject.Parse(jsonString);
string userId = (string)jObjet["user"]["userId"];
string userToken = (string)jObjet["authenticationToken"];

如果您的对象结构将来发生更改,您可以将新的string标记名称作为参数传递给方法。

注意您的JSON结构不正确,对象周围有一组额外的大括号{}

相关内容

  • 没有找到相关文章

最新更新