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

http://json2csharp.com/