如何从System.Text.Json中的JsonNode读取值

qgelzfjb  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(383)

我想序列化一个刷新令牌并将其发送到客户端。
然后在返回时,我想反序列化并读取它。
这是我的密码。

using System.Text.Json;
using System.Dynamic;
using System;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using System.Text.Json.Nodes;

dynamic token = new ExpandoObject();

token.UserName = "John";
token.Expires = DateTime.Now.AddMinutes(5);
token.CreateDate = DateTime.Now;

var options = new JsonSerializerOptions
                {
                    PropertyNameCaseInsensitive = true,
                    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                    DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
                    Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
                };

var refreshToken = JsonSerializer.Serialize(token,  options);

Console.WriteLine(refreshToken);

var deserializedToken = JsonSerializer.Deserialize<JsonNode>(refreshToken, options);

var userName = "How can I extract username from JsonNode";

我尝试使用JsonNode["UserName"].Value,但它不工作。

9avjhtql

9avjhtql1#

因为你使用的是dynamic,所以所有后续的变量也都解析为dynamic,只需要声明一个类型(例如序列化结果为string),然后使用indexer + GetValue

string refreshToken = JsonSerializer.Serialize(token,  options);

JsonNode? deserializedToken = JsonSerializer.Deserialize<JsonNode>(refreshToken, options);
var userName = deserializedToken["userName"].GetValue<string>();
3npbholx

3npbholx2#

反序列化后的类型将是JsonNode,如果尝试使用动态,反序列化后的类型将是JsonElement,因此使用动态也无法获得任何结果,可以使用Parse

JsonNode deserializedToken = JsonNode.Parse(refreshToken);
string userName = (string) deserializedToken["userName"];

你可以用更简单的方法创建一个json字符串,而不需要使用选项

var token = new
    {
        userName = "John",
        expires = DateTime.Now.AddMinutes(5),
        createDate = DateTime.Now
    };

string refreshToken = System.Text.Json.JsonSerializer.Serialize(token);

相关问题