【问题标题】:JSON.NET to deserialize dynamic objectJSON.NET 反序列化动态对象
【发布时间】:2015-11-10 14:14:54
【问题描述】:

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

【问题讨论】:

  • 既然知道JSON结构,就不能序列化成标准类型吗?
  • @ArghyaC:json 数据将来可能会发生变化。无论如何,我已经从 Microsoft Azure API azure.microsoft.com/en-gb/documentation/articles/… 遵循了这个代码示例
  • 您是否尝试过删除开头的{ 并关闭},您有2 个开头和结尾,这在JSON 中是非法的。你也可以试试这个stackoverflow.com/a/8972079/2096538
  • 对不起,我复制了错误的json数据,刚刚更新了问题

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


【解决方案1】:

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

【讨论】:

【解决方案2】:

看起来您在 JSON 字符串中的整个对象周围有一组额外的花括号“{}”。您是否尝试过删除它们以查看是否有效?

我将您的 JSON 字符串粘贴到几个基于网络的 JSON formatters 中,它们都抛出错误,直到我删除了最外面的花括号。

【讨论】:

  • 致 OP - 如果您收到双括号,您可以使用以下命令删除它们:jsonString = jsonString.Substring(1, jsonString.Length - 2);
  • 在某些情况下,使用 JSON.Net 解析有效的 json 时,由于某种原因会添加额外的大括号??这就是我所坚持的。
【解决方案3】:

一种方法,就是像这样使用Linq-to-JSON of 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 结构不正确,您在对象周围有一组额外的大括号{}

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 2011-05-30
    • 2017-06-02
    • 2015-07-14
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多