我有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.NET
的Linq-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
结构不正确,对象周围有一组额外的大括号{}
。