当前位置: 首页 > 知识库问答 >
问题:

如何使用System.Text.json将json字符串或流反序列化到Dictionary

唐啸
2023-03-14

我得到一个json字符串作为流,并试图将其反序列化为字典

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

共有1个答案

郜卓君
2023-03-14

json不仅仅包含字符串。作为一个快速(但不是性能)修复,您可以尝试反序列化到字典

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;
}

 类似资料:
  • 我正在尝试使用来部分地反序列化模型,因此其中一个属性被读取为包含原始JSON的字符串。 示例代码 应该生成模型,其中属性将原始JSON中的Info对象作为字符串包含: 它不能开箱即用并抛出异常: System.Text.Json.JsonException:--- 到目前为止我尝试了什么: 并将其应用于模型中 并将选项添加到 尽管如此,它还是抛出了相同的异常: System.Text.Json.J

  • 问题内容: 我有这个字符串: 我正在反序列化对象: 该对象看起来像: 并尝试创建字典: 但得到。 可能是什么问题? 问题答案: 请参阅mridula的答案,了解为什么您会得到null。但是,如果您想直接将json字符串转换为字典,则可以尝试以下代码段。

  • 问题内容: 如何将上述字符串反序列化为java对象。 我正在使用的类是 问题答案: @基达 我假设您可以控制JSON输入字符串的创建方式。我认为JSON字符串格式不正确,无法对地图类型进行默认的GSON反序列化。 我已经修改了输入字符串供您考虑,这将导致非null的LocalLocationId 如果我对输入字符串的假设不正确,请发表评论。 编辑1:由于无法修改输入,请考虑编写自定义解串器。以下是

  • 我的JSON如下所示: 我的课程如下所示: 如何反序列化到映射如和到

  • 问题内容: 我有一个iOS应用程序,需要处理来自Web服务的响应。响应是包含序列化JSON对象的序列化JSON字符串,如下所示: 请注意,此响应是JSON 字符串 ,而不是JSON对象。我需要做的是将字符串反序列化,这样我就可以得到: 然后我可以用来反序列化为。 但是,我该如何第一步?也就是说,如何“解串”字符串,以便拥有序列化的JSON对象? 仅当顶级对象是数组或字典时才有效;它不适用于字符串。

  • 我已经找了很多但仍然没有得到答案到目前为止,任何帮助是非常感谢! 我有一个简单的到字段映射,并尝试将JSON字符串读取到Java对象。 例外情况: java.lang.IllegalArgumentException:无法解析日期值“null”(格式:“dd-mmm-yyyy”):不可解析日期:“null”com.fasterxml.jackson.databind.deser.std.dateD