反序列化不一致的 JSON 属性

2023-12-02

希望有人可以帮助我解决我尝试使用 Newtonsoft.Json 反序列化的大型 JSON 文件中出现的以下不一致问题。

对象的属性之一有时会显示为:

"roles": [
  {
    "field1" : "value",
    "field2" : "value"
  }
]

而其他时候,相同的属性显示为:

"roles": {
  "roles": [
    {
      "field1" : "value",
      "field2" : "value"
    }
  ]
}

作为参考,该属性在其类中实现为:

[JsonProperty("roles")]
public List<Role> Roles { get; set; }

我需要发生的是,每当发生上述第二种情况时,对象内容都会像第一种情况一样被反序列化。即“外部”对象被丢弃/忽略

当单独的属性有时作为对象出现,有时作为数组出现时,我在其类定义中使用以下方法,成功地处理了此文件中的另一个不一致问题:

[JsonConverter(typeof(SingleValueArrayConverter<Address>))]
public List<Address> Location { get; set; }

并实施为:

public class SingleValueArrayConverter<T> : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object retVal = new Object();
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            retVal = new List<T>() { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            retVal = serializer.Deserialize(reader, objectType);
        }
        return retVal;
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}

但是,我无法解决这个问题。 有人可以帮忙吗?


您可以使用以下方法来处理这种不一致JsonConverter还。它与您所拥有的略有不同,但其想法非常相似:

public class ArrayOrWrappedArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(List<T>).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return CreateListFromJArray((JArray)token, serializer);
        }
        if (token.Type == JTokenType.Object)
        {
            JObject wrapper = (JObject)token;
            JProperty prop = wrapper.Properties().FirstOrDefault();
            if (prop.Value.Type == JTokenType.Array)
            {
                return CreateListFromJArray((JArray)prop.Value, serializer);
            }
        }
        // If the JSON is not what we expect, just return an empty list.
        // (Could return null or throw an exception here instead if desired.)
        return new List<T>();
    }

    private List<T> CreateListFromJArray(JArray array, JsonSerializer serializer)
    {
        List<T> list = new List<T>();
        serializer.Populate(array.CreateReader(), list);
        return list;
    }

    public override bool CanWrite => false;

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

然后只需将转换器添加到您的Roles财产,你应该可以走了:

[JsonProperty("roles")]
[JsonConverter(typeof(ArrayOrWrappedArrayConverter<Role>))]
public List<Role> Roles { get; set; }

工作演示:https://dotnetfiddle.net/F6qgQB

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化不一致的 JSON 属性 的相关文章

  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • Firefox 11 和 GeoLocation 拒绝回调

    Firefox 10 x 一切正常 但升级到 Firefox 11 后出现了问题 I use navigator geolocation getCurrentPosition success failure 但在 FF11 中 当用户通过选
  • 我的用于解决 3 壶水难题的序言程序有什么问题?

    任何人都可以找到为什么我在这段代码中无法通过 go 得到任何真正的答案吗 例如 我写go 7 3 l 我认为它应该将 3 升水转移到第二个水罐中 但根据序言 这是错误的 怎么了 dynamic go 3 dynamic cur state
  • 为什么在 C++ 中字符串文字中的反斜杠必须转义?

    我想为两种语言声明相同的正则表达式模式 对于TCL我这样做 set pattern d s S 但对于 C 我必须对相同的模式执行此操作 boost regex pattern d s S 否则 C 编译器会告诉我们以下信息 warning
  • 如何加载 JAR 外部但相对于 JAR 的文件?

    我需要加载 JAR 之外的文件 但相对于它 lib config config ini准确地说 我使用了那个确切的路径 只要工作目录是 JAR 所在的位置 它就可以正常工作 即 path to jar java jar JAR jar 如果
  • Pandas - 根据多列进行分组并在组内排名

    我有一个像这样的数据框 df pd DataFrame asset id 10 10 10 20 20 20 method id p2 p3 p4 p3 p1 p2 method rank 5 2 2 2 5 1 conf score 0
  • zbar sdk 无法通过使用相机模拟器在 iPhone 模拟器上工作

    我的项目必须支持条形码扫描 我正在使用 zbar sdk 我已经集成了代码并使用 iphone 模拟器运行 我正在使用相机模拟器扫描条形码 它正确打开条形码图像 但条形码扫描不起作用 有人用过这个吗 您可以在iPhone模拟器上测试条形码
  • 如何在Java Restlet中访问请求的标头值?

    我正在使用开发网络服务Restlet Java 为此 我想保护一些网络服务免受未经授权的客户端的侵害 所以我写了Filter类 在那个 Filter 类中我想得到headers请求的 但我收到以下错误 java lang ClassCast
  • 为什么我无法使用单个点访问整数的属性?

    如果我尝试写 3 toFixed 5 存在语法错误 使用双点 插入空格 将三个点放在括号中或使用方括号表示法可以使其正常工作 3 toFixed 5 3 toFixed 5 3 toFixed 5 3 toFixed 5 为什么单点表示法不
  • 如何在 SQL 中抑制或隐藏重复值?

    我已经四处寻找了一下 但还没有找到如何做到这一点 尽管已经找到了很多关于分析其性能的信息 我想执行一个选择 它返回几列数据 然后还返回另一个表中相关行的嵌套表 实际上是同一个表本身连接 但我 认为 这是不相关的 所以数据是这样的 id na
  • WPF 和初始焦点

    似乎当 WPF 应用程序启动时 没有任何东西具有焦点 这实在是太奇怪了 我使用过的所有其他框架都符合您的预期 将初始焦点放在 Tab 键顺序中的第一个控件上 但我已经确认它是 WPF 而不仅仅是我的应用程序 如果我创建一个新窗口 然后在其中
  • 在 Python 中对正则表达式执行 WebDriverWait() 或类似检查

    我希望能够执行类似于WebDriverWait i e WebDriverWait driver 60 until expected conditions text to be present in element By XPATH tr
  • Android Studio 和 AdMob -- 无法实例化以下类

    我一直在尝试在我的应用程序中使用 AdMob 横幅广告 但不断收到错误消息 无法实例化以下类 com google android gms ads AdView java lang VerifyError Expecting a stack
  • 如何摆脱android全屏模式下的顶部褪色边缘?

    通过将以下两行代码放入activity OnCreate中 我可以获得全屏视图 requestWindowFeature Window FEATURE NO TITLE getWindow setFlags WindowManager La
  • 字符串资源文件中的格式语句

    我在通常的 strings xml 资源文件中定义了字符串 如下所示
  • 将 Excel 工作表添加到工作簿末尾

    我正在尝试将 Excel 工作表添加到工作簿的末尾 保留第一个工作表作为摘要 import win32com client Excel win32com client DispatchEx Excel Application Book Ex
  • Java 到 JSP - 如何将 Java 应用程序集成到 JSP 网页中?

    好吧 这肯定是今天最简单的问题了 这是我第一次尝试 Java 和 JSP 我刚刚使用 Eclipse 编写了一个小型 Java 应用程序 现在我想将这个小应用程序提供到网页中 我需要弄清楚Java应用程序和网页之间的联系 这是我的申请 pu
  • Putty - 使用 C# 动态删除文件

    我正在开发一个使用 C 作为编程语言的 Windows 应用程序 要求是 动态登录putty 从特定位置删除旧文件 我目前正在使用下面的代码登录 Putty 但如何运行删除命令 string hostname hostname string
  • Plotly:更新菜单的按钮实际上是如何工作的?

    我为什么想知道 这似乎是一个非常简单的问题 但我在使用下拉菜单编辑具有多个轨迹的图形时遇到了一些困难 所以我真的很渴望确保我理解plotlys下拉菜单 更新菜单和按钮的内部工作原理100 正确 因此 如果有人能抽出时间来看看下面的示例 那就
  • 使用 sscanf 读取带空格的字符串

    对于一个项目 我试图从字符串中读取一个 int 和一个字符串 唯一的问题是sscanf 似乎打破了阅读 s当它看到一个空格时 有什么办法可以绕过这个限制吗 这是我正在尝试做的一个例子 include
  • 反序列化不一致的 JSON 属性

    希望有人可以帮助我解决我尝试使用 Newtonsoft Json 反序列化的大型 JSON 文件中出现的以下不一致问题 对象的属性之一有时会显示为 roles field1 value field2 value 而其他时候 相同的属性显示为