【问题标题】:How to deserialize a json string or stream to Dictionary<string,string> with System.Text.Json如何使用 System.Text.Json 将 json 字符串或流反序列化到 Dictionary<string,string>
【发布时间】:2022-01-13 12:10:28
【问题描述】:

我将一串 json 作为流并尝试将其反序列化为 Dictionary 问题在于它会阻塞数字,即使设置了序列化选项也是如此。如何使用 System.Text 做到这一点?

带有 .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.

如果不是因为我设置了序列化选项的句柄数字属性,这将是有意义的。这是已知的失败还是这里有问题?

【问题讨论】:

标签: c# json system.text.json .net-6.0


【解决方案1】:

您的 json 不只包含字符串。作为一种快速(但不是高效的)修复,您可以尝试将其取消实现为Dictionary&lt;string, object&gt;,然后将其转换为Dictionary&lt;string, string&gt;

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的例子吗?
  • 我只关心我在问题中的那个,但欢迎您使用更详细的示例。
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
相关资源
最近更新 更多