在不使用唯一属性名称的情况下反序列化JSON

贾斯汀

我有一个看起来像下面的json字符串

{
    "1ST": {
        "name": "One",
        "symbol": "1st"
    },
    "2ND": {
        "name": "Two",
        "symbol": "2nd"
    }
}

我正在尝试将其序列化为C#对象。看起来它正在创建字典,所以我创建了以下结构

public class Response
{
    public Dictionary<string, Item> Objects { get; set; }
}

public class Item
{
    public string name { get; set; }
    public string symbol { get; set; }
}

并在序列化过程中运行以下命令

response = JsonConvert.DeserializeObject<Response>(jsonString);

它不会在反序列化上引发错误,但是我的回答只是返回为null。我想念什么?

乔恩·斯基特

您已经有了正确的基本概念,但是却拥有了一个Objects您真正不想要的额外属性:JSON实际上就是字典。您可以将其直接反序列化为Dictionary<string, Item>>这是一个例子:

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

public class Item
{
    public string Name { get; set; }
    public string Symbol { get; set; }

    public override string ToString() => $"{Name}/{Symbol}";
}

public class Test
{
    static void Main()
    {
        var json = File.ReadAllText("test.json");
        var dictionary = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);
        foreach (var entry in dictionary)
        {
            Console.WriteLine($"{entry.Key}: {entry.Value}");
        }
    }
}

输出:

1ST: One/1st
2ND: Two/2nd

现在,如果你需要你的Response类型,有不同的选项:

  • 使Dictionary<string, Item>Objects属性派生并删除该属性。(如果您需要该Objects物业,则不好。)
  • 反序列化到字典,然后创建一个新Response对象并自己分配属性。(如果响应是另一种类型的一部分,则不好。)
  • 研究Json.NET是否具有某些属性,可以将其Objects视为一种“根”属性。

在最后一个方面有些运气,但还没有一个完整的解决方案。如果更改Objects为a,Dictionary<string, JToken>则可以将其应用[JsonExtensionData]到它,这使它充当任何不匹配属性的默认字典。但是,我还没有找到说服Json.NET使用该属性执行适当转换的方法。您可以创建一个字典,每次添加条目时都会执行从JToken的转换Item(使用常规Json.NET代码),然后将该值添加到另一个字典中-但这很丑陋。这可能只是Json.NET无法处理的情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JSON.net在不使用模式的情况下反序列化JSON

在响应中缺少属性名称的情况下反序列化JSON

JSON.net:如何在不使用默认构造函数的情况下反序列化?

有没有一种方法可以在不使用python GIL的情况下进行序列化/反序列化

在属性名称中使用$反序列化JSON

使用变量属性名称反序列化JSON

在属性名称中使用点反序列化JSON

使用数字作为属性名称反序列化JSON

在使用Jackson进行类序列化时添加类型信息,以便可以在不使用注释的情况下使用接口类型反序列化?

使属性反序列化但不使用json.net序列化

在只有一个条目的情况下,反序列化json,其中属性具有对象而不是数组?

使用JSON.NET序列化/反序列化动态属性名称

在哪种情况下,杰克逊使用ObjectMapper.readTree反序列化JSON时会创建ShortNode?

如何使用 JSON-B 在没有 setter 的情况下解组/反序列化集合

如何通过使用唯一标识符作为属性重复标签名称来反序列化XML?

为什么在序列化/反序列化的情况下仅创建一个父对象

在不创建反序列化类的情况下访问 json 中的某个变量

如何在对象结构未知的情况下反序列化JSON对象

如何在不使用 File.ReadAllLines 的情况下从 json 文件读取序列化对象?C#

如何在不使用文件的情况下序列化一个对象(例如HashMap)?

在不反序列化的情况下处理JSON

在不使用属性的情况下将对象序列化为XML

如何在不使用序列化的情况下制作Java对象的深层副本?

如何在不使用对象的情况下序列化为JSON

没有属性名称的json反序列化数组

json从旧版属性名称反序列化

用'空格'分隔的属性名称反序列化JSON

使用json.net中的属性的两个可能的属性名称反序列化?

不使用 jObject 反序列化 json