JSON.NET反序列化动态对象

时间:2015-11-10 14:14:54

标签: c# json json.net azure-api-apps

我有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\"}

3 个答案:

答案 0 :(得分:2)

从长远来看,你最好完全复制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/

答案 1 :(得分:1)

看起来你有一套额外的花括号&#34; {}&#34;围绕JSON字符串中的整个对象。您是否尝试删除它们以确定它是否有效?

我将你的JSON字符串粘贴在一些基于网络的JSON formatters中,他们都丢错了,直到我删除了最外面的花括号。

答案 2 :(得分:1)

一种方法是使用Json.NET这样的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标记名称作为参数传递给您的方法。

注意 您的{}结构不正确,您在对象周围有一组额外的大括号the_status <- c('2: approved (newer)', '5: approved (extended)', '3: denied (not appealed)', '14: denied (not appealed/withdrawn)', '20: approved', '21: denied', '24: not approved within 21 days', '28: not approved in 21 days')