JObject.Parse 与 JsonConvert.DeserializeObject

2023-11-30

JsonConvert.DeserializeObject 和 JObject.Parse 有什么区别?据我所知,两者都采用字符串并且都在 Json.NET 库中。什么样的情况会让一种情况比另一种更方便,或者主要只是偏好?

作为参考,下面是我使用两者来做完全相同的事情的示例 - 解析 Json 字符串并返回 Json 属性之一的列表。

public ActionResult ReadJson()
{
    string countiesJson = "{'Everything':[{'county_name':null,'description':null,'feat_class':'Civil','feature_id':'36865',"
                    +"'fips_class':'H1','fips_county_cd':'1','full_county_name':null,'link_title':null,'url':'http://www.alachuacounty.us/','name':'Alachua County'"+ ",'primary_latitude':'29.7','primary_longitude':'-82.33','state_abbreviation':'FL','state_name':'Florida'},"+
                    "{'county_name':null,'description':null,"+ "'feat_class':'Civil','feature_id':'36866','fips_class':'H1','fips_county_cd':'3','full_county_name':null,'link_title':null,'url':'http://www.bakercountyfl.org/','name':'Baker County','primary_latitude':'30.33','primary_longitude':'-82.29','state_abbreviation':'FL','state_name':'Florida'}]}";

    //Can use either JSONParseObject or JSONParseDynamic here
    List<string> counties = JSONParseObject(countiesJson);
    JSONParseDynamic(countiesJson);
    return View(counties);
}

public List<string> JSONParseObject(string jsonText)
{
    JObject jResults = JObject.Parse(jsonText);
    List<string> counties = new List<string>();
    foreach (var county in jResults["Everything"])
    {
        counties.Add((string)county["name"]);
    }
    return counties;
}

public List<string> JSONParseDynamic(string jsonText)
{
    dynamic jResults = JsonConvert.DeserializeObject(jsonText);
    List<string> counties = new List<string>();
    foreach(var county in jResults.Everything)
    {
        counties.Add((string)county.name);
    }
    return counties;
}

LINQ 到 JSON API (JObject, JToken等)的存在是为了允许使用 JSON,而无需提前知道其结构。您可以使用反序列化任何任意 JSONJToken.Parse,然后使用其他方法检查和操作其内容JToken方法。如果您只需要 JSON 中的一两个值(例如县名),LINQ-to-JSON 也能很好地工作。

JsonConvert.DeserializeObject另一方面,主要用于当您提前知道 JSON 的结构并且想要反序列化为强类型类时。例如,以下是如何将完整的县数据集从 JSON 获取到列表中的方法County对象。

class Program
{
    static void Main(string[] args)
    {
        string countiesJson = "{'Everything':[{'county_name':null,'description':null,'feat_class':'Civil','feature_id':'36865',"
                +"'fips_class':'H1','fips_county_cd':'1','full_county_name':null,'link_title':null,'url':'http://www.alachuacounty.us/','name':'Alachua County'"+ ",'primary_latitude':'29.7','primary_longitude':'-82.33','state_abbreviation':'FL','state_name':'Florida'},"+
                "{'county_name':null,'description':null,"+ "'feat_class':'Civil','feature_id':'36866','fips_class':'H1','fips_county_cd':'3','full_county_name':null,'link_title':null,'url':'http://www.bakercountyfl.org/','name':'Baker County','primary_latitude':'30.33','primary_longitude':'-82.29','state_abbreviation':'FL','state_name':'Florida'}]}";

        foreach (County c in JsonParseCounties(countiesJson))
        {
            Console.WriteLine(string.Format("{0}, {1} ({2},{3})", c.name, 
               c.state_abbreviation, c.primary_latitude, c.primary_longitude));
        }
    }

    public static List<County> JsonParseCounties(string jsonText)
    {
        return JsonConvert.DeserializeObject<RootObject>(jsonText).Counties;
    }
}

public class RootObject
{
    [JsonProperty("Everything")]
    public List<County> Counties { get; set; }
}

public class County
{
    public string county_name { get; set; }
    public string description { get; set; }
    public string feat_class { get; set; }
    public string feature_id { get; set; }
    public string fips_class { get; set; }
    public string fips_county_cd { get; set; }
    public string full_county_name { get; set; }
    public string link_title { get; set; }
    public string url { get; set; }
    public string name { get; set; }
    public string primary_latitude { get; set; }
    public string primary_longitude { get; set; }
    public string state_abbreviation { get; set; }
    public string state_name { get; set; }
}

请注意,Json.Net 使用给定的类型参数JsonConvert.DeserializeObject方法来确定要创建的对象类型。

当然,如果调用时不指定类型DeserializeObject,或者你使用object or dynamic,那么 Json.Net 就别无选择,只能反序列化为JObject。 (您可以亲眼看到您的动态变量实际上包含一个JObject通过检查jResults.GetType().FullName.)所以在这种情况下,两者之间没有太大区别JsonConvert.DeserializeObject and JToken.Parse;两者都会给你相同的结果。

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

JObject.Parse 与 JsonConvert.DeserializeObject 的相关文章

  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 并行运行多个任务

    我有一个代理列表 每个代理都会访问不同的站点并从站点中提取所需的数据 目前它一次只做一个 但我希望同时运行 10 20 个任务 这样它就可以一次性从 20 个站点下载 而不是只下载一个 这是我目前正在做的事情 private async T
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • Adobe Illustrator 中的折线简化如何工作?

    我正在开发一个记录笔划的应用程序 您可以使用定点设备来绘制笔划 在上图中 我绘制了一个笔划 其中包含 453 个数据点 我的目标是大幅减少数据点的数量 同时仍然保持原始笔画的形状 对于那些感兴趣的人 上图笔画的坐标可以作为GitHub 上的

随机推荐

  • 使用 cfprocparam 将数组或列表导入 Oracle

    我有一个值列表 想通过存储过程插入到表中 我想我会将一个数组传递给 Oracle 并循环访问该数组 但我不知道如何将数组传递给 Oracle 我会传递一个列表 但我不知道如何使用该列表将其转换为使用 PL SQL 的数组 我对 PL SQL
  • 使用 React hooks 在 REACTJS 中使用数组填充动态下拉列表的步骤

    请原谅我缺乏知识 因为我对 ReactJS 还很陌生 我正在尝试创建一个动态下拉系统 其中有国家下拉菜单和城市下拉菜单 并且我想从其中包含多个数组的 const 中获取数据 这是我拥有的 const 的示例 const countries
  • 如何为iphone 3.0编译pjsip

    我一直在尝试为 iphone 3 0 编译 pjsip 但一直无法做到 我尝试遵循 siphon 和 voiphone 使用 pjsip 的开源 iphone 项目 的指南 显然我不是唯一一个无法为 iphone 3 0 编译 pjsip
  • 如何建立自引用表

    在源表中 有两列 如下快照所示 那么对于目标表 它应该是这样的 DimLocationKey 是自动生成的代理键 如何在SSIS中实现自引用效果 我尝试了以下方法 但它不起作用 因为查找中没有匹配项 如果该列可为空 则您可以加载 locat
  • 在char数组中间插入字符

    我有一个填充了一些字符的字符数组 假设我的字符数组中有 HelloWorld 不是字符串 占用索引0到9 我想做的是在数组中间插入一个字符 然后将其余字符推到一边 为要插入的新字符腾出空间 因此 我可以使 char 数组中包含 Hello
  • 理解和实现 R 中分位数函数的数值积分

    我需要使用 R 计算下面的积分 我设法在 R 中使用分位数回归完成 q theta x 函数 包 quantreg matrix structure c 0 01 0 02 0 03 0 04 0 05 0 06 0 07 0 08 0 0
  • cakePHP 文件下载未找到或不可读

    我现在已经挣扎了一个小时试图解决这个问题 我用它来下载文件app uploads 目录 它说目录未找到或不可读 但我检查了它 它也存在使用的文件 file File filename 我想知道我在这里缺少什么 file this gt Fi
  • 在executeBatch()之后使用CallableStatement检索ResultSet

    我需要多次调用存储过程并使用executeBatch 为了这 每次调用都应返回包含结果的表 但我无法访问此结果 接下来的代码工作正常 callableStatement setString 1 foo callableStatement s
  • 重新设计后如何拒绝来自 iTunes Connect 的二进制文件 (12/09/2014)?

    我需要拒绝我的二进制文件 以便重新上传 这一直是 iTunes connect 上的一个隐藏选项 现在重新设计了 我到处找都找不到 根据苹果自己的文档 从审核中删除您的版本 打开应用程序的 应用程序详细信息 页面 如中所述打开应用程序的 应
  • 如果安装了3.5,还需要.net Framework 2.0吗?

    我想知道如果安装了 net Framework 3 5 运行 net 2 0应用程序是否仍然需要 net Framework 2 0 谢谢 Net 3 5 实际上是 Net 2 0 加上一些额外功能 除非 Net 2 0 也存在 否则无法安
  • re.findall 表现得很奇怪

    源字符串是 Python 3 4 3 s r abc123d hello 3 1415926 this is my book 这是我的模式 pattern r 0 9 0 9 0 9 然而 re search可以给我正确的结果 m re s
  • 如何防止用户在 Ionic/Cordova 中截屏?

    是否可以阻止用户在使用 Ionic Cordova 开发的 Android 应用程序中截取屏幕截图 如果可以的话 怎样做 我在 Ionic 论坛上提问 但没有得到答案 是的 您可以使用插件来做到这一点 使用这里的一个 http blog d
  • 是否有使用 @Version 的可配置替代方案?

    我正在放置一个带注释的字段 Version在我所有的 JPA 域类中 但这似乎只是额外的样板 有没有办法通过配置来解决这个问题 TIA Ole 据 JPA 规范告诉我们 您无法更改 Version通过 配置 进行注释 你要么使用 Versi
  • 异步回发后如何保持整个页面滚动位置

    我正在使用 asp net 4 0 iis 7 5 microsoft Visual Studio 2010 我想要的是当异步回发发生时 更新面板 保持整个页面 浏览器 滚动位置 不是 div 或面板 我怎样才能做到这一点 实际上我有一个函
  • 动态添加到 TableLayoutPanel 的行显示在不同的行位置

    我正在尝试通过单击按钮将 TextBox 动态添加到 TableLayoutPanel 中 通过单击鼠标选择行 选择行后 单击按钮将在所选行号上插入文本框 Problem是正确之后显示在不同选定的行上使用 TextBox 3 或 4 次 进
  • 如何更改 ScrollBar 的宽度?

    我想更改 TFrame 的 ScrollingBar 宽度 我知道我可以通过以下方式更改系统中的所有 ScrollingBar SystemParametersInfo SPI SETNONCLIENTMETRICS 但是我该如何为特定的
  • Haskell 列表错误的部分和

    我需要在 Haskell 中编写一个函数 对列表的元素求和 直到某些特定元素存储在另一个列表中 例如partial add 1 2 3 4 5 6 2 5 0应该返回 3 12 6 我已经达到了这样的程度 partial add count
  • 删除数组中连续出现的重复项

    有什么方法可以从下面的数组中删除连续的重复项 同时只保留第一个重复项 该数组如下所示 a array 1 gt go 2 gt stop 3 gt stop 4 gt stop 5 gt stop 6 gt go 7 gt go 8 gt
  • 如何在 Mac OS cocoa 中获取已安装 USB 设备的设备 ID、供应商 ID 和产品 ID

    我正在尝试编写一个 Cocoa 程序来检测连接到 Mac OS 的 iPod 我正在监听 NSWorkspaceDidMountNotification 和 NSWorkspaceDidUnmountNotification 以获取 USB
  • JObject.Parse 与 JsonConvert.DeserializeObject

    JsonConvert DeserializeObject 和 JObject Parse 有什么区别 据我所知 两者都采用字符串并且都在 Json NET 库中 什么样的情况会让一种情况比另一种更方便 或者主要只是偏好 作为参考 下面是我