如何使用 Gson 在 asmx Web 服务的 Json 中包含对象类型

2024-03-31

当向.net 2.0中的asmx Web服务发送数据时,如何保留json字符串中的对象类型?

例如:

class A{
 string name;
}

class B : A {
 string address;
}

和网络方法:

[WebMethod]
public void PushJson(A obj){
  B b = (B) obj;
}

现在,在上面的示例场景中,可以说,我发送{"obj":{"name":"waqas","address":"sweden"}}那么我如何强制我的json字符串充当B类的类型,以便它可以被web方法接受为A类的对象并进一步解析回B类的对象?简而言之,如何在 json 中保留多态性?

我注意到编译器抛出了我System.InvalidCastException每当我尝试执行这种模式时

附:我注意到 .net 添加了__type对于复杂对象,同时序列化为 json。我们是否可以包含这个键来帮助.net自动解析具有正确类类型的json字符串?

任何帮助/建议都会有帮助。


Update:

如果我们仔细观察wsdlasmx web 服务的,因此其类继承父类的对象包含类似的内容<s:extension base="tns:ParentClassName">。我认为这个扩展部分是我可能需要转换成 Json 的东西。对此有什么想法吗?


您在标题中提到了 GSON,但我不确定它在这张图片中的作用。所以,我可能偏离了错误的切线。但是,如果您只是询问如何让 .NET 反序列化您的 JSON,是的,您可以使用 __type 参数。它必须是第一位的。

{"obj":{"__type":"B","name":"waqas","address":"sweden"}}

我能够让它在测试项目中工作,但就像我说的,不涉及 GSON。

EDIT:其实你可能还想看看这个其他答案https://stackoverflow.com/a/10805715/1539015 https://stackoverflow.com/a/10805715/1539015讨论如何让 GSON 包含 __type 参数。

EDIT2:我创建了一个新的 .NET 网站。添加了包含 A 类和 B 类的类文件(修改为公开):

public class A
{
    public string name;
}

public class B : A
{
    public string address;
}

然后我添加了一个 Web 服务来获取问题中的 WebMethod。我还包含了一个 GetJson 方法。这是背后的代码:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {

    public WebService () {
    }

    [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
    [WebMethod]
    public B GetJson()
    {
        return new B() { address = "addr", name = "nm" };
    }

    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    [WebMethod]
    public string PushJson(A obj)
    {
        B b = (B)obj;
        return b.address;
    }
}

然后我编辑了默认页面以使用 jQuery 调用 Web 方法:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <p>
        <div id="GetResult">Click here for the result of getting json.</div>    
        <div id="PushResult">Click here for the result of pushing json.</div>    
    </p>
    <script type="text/javascript">
        $(document).ready(function () {
            // Add the page method call as an onclick handler for the div.
            $("#GetResult").click(function () {
                $.ajax({
                    type: "GET",
                    url: "WebService.asmx/GetJson",
                    contentType: "application/json; charset=utf-8",
                    success: function (msg) {
                        // Replace the div's content with the page method's return.
                        $("#GetResult").text(msg.d.name);
                    }
                });
            });
            $("#PushResult").click(function () {
                $.ajax({
                    type: "POST",
                    url: "WebService.asmx/PushJson",
                    data: '{"obj":{"__type":"B","name":"waqas","address":"sweden"}}',
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (msg) {
                        // Replace the div's content with the page method's return.
                        $("#PushResult").text(msg.d);
                    }
                });
            });
        });  
    </script>
</asp:Content>

如果在 PushJson 的 webservice 方法中放置一个断点,您可以看到创建的对象是 B 类型,并且它运行时还显示它可以转换为 B 类型并使用。

这里没有 GSON,但我相信我链接的另一篇文章应该展示如何让 GSON 生成 __type 参数。

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

如何使用 Gson 在 asmx Web 服务的 Json 中包含对象类型 的相关文章

  • 将 aspx 文件加载到 xmldocument 中

    我希望能够将 aspx 页面加载到 XmlDocument 变量中 我怎么做 这是我尝试过的 它期望 xml 文件而不是 aspx 页面 有没有办法将aspx页面即时转换为xml文档并加载它 谢谢 string filePath C Web
  • 如何从网站的 .NET 安装程序中排除文件夹?

    我们的网站有一个安装程序 效果很好 我在创建安装程序时排除了 web config 和其他一些文件 但是我似乎无法排除文件夹 这可能吗 我已使用 NET 内置 Web 安装项目创建了安装程序 该项目可在新项目对话框中的 Visual Stu
  • 多线程 Web 应用程序

    我知道有很多情况都是在应用程序中使用多线程的好例子 但是什么时候最好在 net Web 应用程序中使用多线程 Web 应用程序几乎肯定已经由托管环境 IIS 等 实现多线程化 如果您的页面受 CPU 限制 并且想要使用多个核心 那么可以说多
  • 参考上一个问题:为什么 VBA 没有加载所有发票详细信息

    除了上一个问题之外 我们在销售发票上仍然存在相同的加载失败问题 下面的 VBA Json 仍然仅加载一行或第一个产品详细信息行 而不是与表中该销售发票合作的所有产品行详细信息 我们希望下面的 VBA 能够根据参数加载发票详细信息 例如 如果
  • Apache Camel 的 JsonMappingException

    我在骆驼路线上遇到以下异常 Caused by com fasterxml jackson databind JsonMappingException No serializer found for class org apache cam
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro
  • JSON 转换带有整数键的 Map

    我有一个测试代码的小样本 我尝试将 Map 转换为 JSON 字符串并返回 在解析 JSON 字符串时 结果映射包含字符串键 1 而不是整数键 1 从而导致测试失败 用作此映射的键的 POJO 也会发生同样的情况 这是预期行为还是我省略了
  • 清除asp.net表单中的所有字段

    我有一个asp net form 在这个form我想清除我输入的所有数据textbox dropdownlist等等 那么我怎样才能不去每个文本框并设置值呢 like TextBox1 Text 等等 我如何清除表单的所有值 Either
  • c#/asp.net - 如何捕获“System.Web.HttpException:请求超时”?

    在我的 asp net c 项目中 我使用 iTextsharp dll 从许多 pdf 文档中读取文本 但有时会出现此错误 System Web HttpException 请求超时 但实现它的代码是 public static bool
  • aspx页面中的if语句

    我想在我的网站上编写一个基本的 if 语句 以根据变量是否设置为 true 来显示项目 1 或项目 2 我对 NET 不太熟悉 需要一些关于如何让 if 语句在 aspx 页面上工作的基本结构的帮助 如果目的是显示或隐藏页面的一部分 那么您
  • 从 Dropbox C# 下载文件[重复]

    这个问题在这里已经有答案了 我正在尝试下载 Dropbox 中的 pdf 文件 我需要将其保存到本地计算机中 可以是任何文件夹C Users User Desktop例如 这是我一直在使用的代码 public void DownloadPd
  • 检索 Steam 市场上物品的价格历史记录

    关于 Steam 市场上的物品 我想知道是否有办法检索某物品在一段时间内的价格历史记录 我知道 Steam 为想要将市场特定数据集成到自己网站中的开发人员提供了一个特殊的 api 但我还没有找到任何有关以 json 形式检索商品价格历史记录
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 在Python中,如何通过去掉括号和大括号来打印Json

    我想以一种很好的方式打印 Json 我想去掉方括号 引号和大括号 只使用缩进和行尾来显示 json 的结构 例如 如果我有一个像这样的 Json A A1 1 A2 2 B B1 B11 B111 1 B112 2 B12 B121 1
  • 如何绕过 CF8 编码不可打印字符中的 SerializeJSON?

    SerializeJSON 创建具有不可打印字符 即 ASCII 21 的 JSON 这是无效的 JSON 我该如何解决这个问题 删除不可打印字符的正则表达式会起作用吗 什么正则表达式会删除不可打印的字符 嗯 这个简单的解决方案是为 cff
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp
  • Kendo 刷新 (DropDownList.refresh()) 不起作用错误未定义

    我试图在另一个 DropDownList 更改后刷新下拉列表 但 Refresh 方法未定义错误正在升级 我尝试再次读取数据源 它显示它正在加载 但数据仍然相同 帮助解决这个问题请 Code DropDownList1 change fun
  • 如何在 R 中解析堆叠多个 JSON 的文件?

    我在 R 中有以下 堆叠 JSON 对象 example1 json ID 12345 Timestamp 20140101 Usefulness Yes Code event1 A result 1 ID 1A35B Timestamp
  • 如何将 JSON 文本转换为 PHP 关联数组

    我将以下 JSON 对象存储在文本文件 data txt 中 player black time 0 from 2c to 3d 我使用 php 阅读 问题 有没有简单的方法可以转换 data到 PHP 关联数组 我尝试过使用json de

随机推荐

  • Java - 按步骤切片任何数组

    在 python 中 我们可以执行以下操作 array 0 1 2 3 4 5 6 7 8 9 10 new array array 3 print new array gt gt gt 0 3 6 9 Java中有类似的东西吗 我一直在寻
  • 朱莉娅中的矢量化“in”函数?

    我经常想要循环遍历数据帧的长数组或列 并且对于每个项目 查看它是否是另一个数组的成员 而不是做 giant list a c j good letters a b isin falses size giant list 1 for i 1
  • 如何一次推送单个docker镜像层?

    我已经开始推送新的镜像 场景是这样的 b57ecdb750f2 Pushing gt 43 57MB 473 9MB 9b7e4da6c261 Pushing gt 18 94kB 21d523b40367 Pushed e18c77c6a
  • TCP/IP 消息帧

    我制作了一个 TCP IP 服务器 客户端 它是异步的 但它连接了消息 如何正确地在开头添加标头 然后在末尾使用字符串生成器来取消连接完整消息 服务器读取消息 Private Sub ReadCallback ByVal result As
  • 在 componentDidMount 中导航-react-router-dom v6

    这是我第一次使用react router dom v6 我对v4很熟悉 我有一个电影列表 每部电影都有一个 id 如果用户在 url 中输入了错误的电影 id 我需要导航到未找到的页面 我使用类组件的问题所以我坚持使用 componentD
  • R - 通过多个 URL 进行网页抓取?带着 rvest 和 purrr

    我正在尝试为我正在从事的项目抓取足球统计数据 并且我正在尝试利用 rvest 和 purrr 来循环遍历 url 末尾的数值 我不确定我错过了什么 但我有一段代码以及不断出现的错误消息 library xml2 library rvest
  • WPF c# .net 框架 4.8 x:绑定

    我读到x Bind 它比Binding 但是在我的应用程序 WPF C 和 NET Framework 4 8 中 当我把x Bind在任何部分 TextBox Text x Bind Visual Studio 对我说 Windows P
  • 随机数:0或1

    我是不是看得太远了 看不到像选择一个数字 0 或 1 这样简单的事情 Random rand new Random if rand NextDouble 0 lnkEvents CssClass selected else lnkNews
  • 创建动态匿名类型变量

    我可以创建一个匿名类型变量 然后添加更多属性吗 E g var x new Name Ahmed 并想添加Age到它 我怎样才能做到这一点 另一个问题 我在一些博客上看到一种类型AnonymousType这个类的名称空间是什么 这是例子ht
  • 自定义 CKEditor 工具栏

    我想自定义CKEditor的工具栏 不过 首先我想要一个工具栏可用选项的完整列表 我搜索了工具栏选项并发现了以下不完整列表 请帮我找到完整的列表 以便我可以根据我的要求进行选择 config toolbar MyToolbar name d
  • 寻找一种算法(二维二分查找的版本)

    简单的问题和已知的算法 我有一个有 100 名成员的大数组 前 X 个成员为 0 其余为 1 找到 X 我通过二分查找来解决这个问题 检查成员 50 如果它是 0 检查成员 75 等等 直到找到相邻的 0 和 1 我正在寻找针对二维相同问题
  • 将 ArrayBuffer 响应转换为 JSON

    在这里 我调用 GetFile 以 ArrayBuffer 对象的形式获取响应 如果我执行 response errors undefined 则在网络选项卡中响应为 errors photoProof Image is not avail
  • 在 postgres 查询中使用 ANY 时,有没有办法保留顺序或数组?

    我希望能够使用进行查询ANY它维护传递给 any 函数的数组的顺序 考虑这个简单的例子 create table stuff id serial value int insert into stuff value values 1 2 3
  • QProgressBar不显示进度?

    我在更新进度条时的第一个天真的做法是在正在进行处理的循环中包含以下几行 制作如下内容 while data hasMoreItems doSomeProcessing data nextItem Added these lines but
  • 使用 $& 全局变量的编程别名方法

    我正在尝试给一个使用 Ruby 特殊方法的方法起别名 返回最后一个正则表达式匹配 http jimneath org 2010 01 04 cryptic ruby global variables and their meanings h
  • GOLANG:遍历目录树并处理文件 -- err = '没有这样的文件或目录

    我正在编写一个例程来遍历目录树并为我找到的每个文件创建数字签名 加盐哈希 在测试它时 我得到了这种奇怪的行为 如果我给程序一个目录 上方 的根路径 程序可以遍历树并打印出文件名 但是如果我尝试打开文件以读取它的字节 我在例程找到的文件上收到
  • 聚合 ViewModel 是个好主意吗?

    将一个 ViewModel 作为另一个 ViewModel 的属性是好还是坏主意 例如 public sealed class ContentManagerViewModel ViewModel public FindViewModel F
  • Node js - ftp-srv - 需要简单的 ftp 服务器示例

    最近几天我试图让一个简单的 ftp 服务器在 NodeJS 中运行 我在这里找到了一个名为 ftp srv 的包 其中包含一些文档 https www npmjs com package ftp srv https www npmjs co
  • Watson Conversation - 从嵌套上下文中检索特定数据

    我希望交互看起来像这样 机器人 命名一个国家 用户 墨西哥 Bot 墨西哥的人口是 大约120M 目前 我已经对人口进行了硬编码 如下所示 context inputcountry
  • 如何使用 Gson 在 asmx Web 服务的 Json 中包含对象类型

    当向 net 2 0中的asmx Web服务发送数据时 如何保留json字符串中的对象类型 例如 class A string name class B A string address 和网络方法 WebMethod public voi