如何使用 System.Text.Json 将 json 字符串或流反序列化到 Dictionary<string,string>
Posted
技术标签:
【中文标题】如何使用 System.Text.Json 将 json 字符串或流反序列化到 Dictionary<string,string>【英文标题】:How to deserialize a json string or stream to Dictionary<string,string> with System.Text.Json 【发布时间】:2022-01-13 12:10:28 【问题描述】:我将一串 json 作为流并尝试将其反序列化为 Dictionary
带有 .NET 6 的 Program.cs:
using System;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
Console.WriteLine("Converting Json...");
var result = await DeserializeJson();
Console.WriteLine($"result: result");
async Task<Dictionary<string, string>> DeserializeJson()
var jsonText = "\"number\": 709, \"message\": \"My message here\",\"bool\": true";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
var options = new JsonSerializerOptions
PropertyNameCaseInsensitive = true,
NumberHandling = JsonNumberHandling.WriteAsString
;
var fullResponse = await JsonSerializer.DeserializeAsync<Dictionary<string, string>>(stream, options);
return fullResponse;
导致的主要错误:
---> System.InvalidOperationException: Cannot get the value of a token type 'Number' as a string.
如果不是因为我设置了序列化选项的句柄数字属性,这将是有意义的。这是已知的失败还是这里有问题?
【问题讨论】:
thecodebuzz.com/… 【参考方案1】:您的 json 不只包含字符串。作为一种快速(但不是高效的)修复,您可以尝试将其取消实现为Dictionary<string, object>
,然后将其转换为Dictionary<string, string>
:
async Task<Dictionary<string, string>> DeserializeJson()
var jsonText = "\"number\": 709, \"message\": \"My message here\",\"bool\": true";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
var options = new JsonSerializerOptions
PropertyNameCaseInsensitive = true,
NumberHandling = JsonNumberHandling.WriteAsString ,
;
var fullResponse = await JsonSerializer.DeserializeAsync<Dictionary<string, Object>>(stream, options);
return fullResponse?.ToDictionary(pair => pair.Key, pair => pair.ToString());
或者手动解析文档:
async Task<Dictionary<string, string>> DeserializeJson()
var jsonText = "\"number\": 709, \"message\": \"My message here\",\"bool\": true";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
var jsonDocument = JsonDocument.Parse(stream);
var dictionary = jsonDocument.RootElement
.EnumerateObject()
.ToDictionary(property => property.Name, property => property.Value.ToString());
return dictionary;
【讨论】:
有没有办法“把所有东西都变成字符串”,即使它只是一个引用号而不是嵌套对象? @CoderLee 你能提供一个json的例子吗? 我只关心我在问题中的那个,但欢迎您使用更详细的示例。以上是关于如何使用 System.Text.Json 将 json 字符串或流反序列化到 Dictionary<string,string>的主要内容,如果未能解决你的问题,请参考以下文章
Swagger UI 不使用 Newtonsoft.Json 序列化十进制,而是使用 System.Text.json
将 false 反序列化为 null (System.Text.Json)
如何使用 System.Text.Json 将 json 字符串或流反序列化到 Dictionary<string,string>
System.Text.Json:当json配置具有通用JsonStringEnumConverter时,如何将单个枚举序列化为数字[重复]