JSON.NET 反序列化动态对象
JSON.NET to deserialize dynamic object
我有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;
但是它说
"Unknown member user/ authenticationToken"
有什么想法吗?
更新:
我抄错了json数据,其实应该是这样的:
{\"user\":{\"userId\":\"sid:C4F4E93856104F078A11FE95892F0158\"},\"authenticationToken\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmdWxscm93IjoiYWxsIiwiRGJnMiI6ImxvZ2luIiwidmVyIjoiMyIsInVpZCI6InNpZDpDNEY0RTkzODU2MTA0RjA3OEExMUZFOTU4OTJGMDE1OCIsImlzcyI6InVybjptaWNyb3NvZnQ6d2luZG93cy1henVyZTp6dW1vIiwiYXVkIjoidXJuOm1pY3Jvc29mdDp3aW5kb3dzLWF6dXJlOnp1bW8iLCJleHAiOjE0NDk3NjE1NDEsIm5iZiI6MTQ0NzE2OTU0MX0.oVH8R2134UQQDpXfzPv2mmrj7M05w2mzWtbp70i7GEU\"}
看起来您在 JSON 字符串中的整个对象周围有一组额外的大括号“{}”。您是否尝试删除它们以查看它是否有效?
我将您的 JSON 字符串粘贴到一些基于网络的 JSON formatters 中,但在我删除最外层的花括号之前它们都抛出错误。
一种方法是像这样使用 Json.NET
中的 Linq-to-JSON
var jsonString = File.ReadAllText(@"C:\YourDirectory\user.json");
var jObjet = JObject.Parse(jsonString);
string userId = (string)jObjet["user"]["userId"];
string userToken = (string)jObjet["authenticationToken"];
如果您的对象结构将来发生变化,您可以将新的 string
标签名称作为参数传递给您的方法。
备注
您的 JSON
结构不正确,对象周围有一组额外的大括号 {}
。
在较长的 运行 中,您最好准确地复制 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
我有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;
但是它说
"Unknown member user/ authenticationToken"
有什么想法吗?
更新:
我抄错了json数据,其实应该是这样的:
{\"user\":{\"userId\":\"sid:C4F4E93856104F078A11FE95892F0158\"},\"authenticationToken\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmdWxscm93IjoiYWxsIiwiRGJnMiI6ImxvZ2luIiwidmVyIjoiMyIsInVpZCI6InNpZDpDNEY0RTkzODU2MTA0RjA3OEExMUZFOTU4OTJGMDE1OCIsImlzcyI6InVybjptaWNyb3NvZnQ6d2luZG93cy1henVyZTp6dW1vIiwiYXVkIjoidXJuOm1pY3Jvc29mdDp3aW5kb3dzLWF6dXJlOnp1bW8iLCJleHAiOjE0NDk3NjE1NDEsIm5iZiI6MTQ0NzE2OTU0MX0.oVH8R2134UQQDpXfzPv2mmrj7M05w2mzWtbp70i7GEU\"}
看起来您在 JSON 字符串中的整个对象周围有一组额外的大括号“{}”。您是否尝试删除它们以查看它是否有效?
我将您的 JSON 字符串粘贴到一些基于网络的 JSON formatters 中,但在我删除最外层的花括号之前它们都抛出错误。
一种方法是像这样使用 Json.NET
中的 Linq-to-JSON
var jsonString = File.ReadAllText(@"C:\YourDirectory\user.json");
var jObjet = JObject.Parse(jsonString);
string userId = (string)jObjet["user"]["userId"];
string userToken = (string)jObjet["authenticationToken"];
如果您的对象结构将来发生变化,您可以将新的 string
标签名称作为参数传递给您的方法。
备注
您的 JSON
结构不正确,对象周围有一组额外的大括号 {}
。
在较长的 运行 中,您最好准确地复制 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