【问题标题】:C# JSON parse instead of RC# JSON 解析而不是 R
【发布时间】:2018-08-15 19:28:08
【问题描述】:

假设我有一个如下所示的嵌套 json 文件:

[{"toplevel":{"firstleveldata":{"id":12345,"no":123}},"secondleveldata":{"fruit":{"apples":"y"},"veg ":{"small":{"gree":{"fresh":{"available":3}}}}},"thirdleveldata":{"fruit":{"changes":[{"itemid":1 ,"subno":1,"green":[],"red":[{"extraid":2,"element":5}]}]}}}]

下面的 R 代码可以将它解析为一个不错的 data.frame,除了最后一个(如果可以修复那是一个奖励)

使用 C# 的简洁替代方案是什么样的?这不是我以前编码过的东西,所以不知道从哪里开始。

最终目标是将嵌套的 JSON 导出为 csv,多个 csv 带有主键/外键以在必要时合并。

上下文的 R 代码。

library(jsonlite)

library(tidyverse)

fun <- function(x)
       {list(
#keys
id = pluck(x,"toplevel","firstleveldata","id", .default = NA),
no = pluck(x,"toplevel","firstleveldata","no", .default = NA),

apples = pluck(x,"secondleveldata","fruit","apples", .default = NA),
itemid = pluck(x,"toplevel","thirdleveldata","fruit","changes","itemid", .default = NA) #doesn't work)}

out<-map_df(list.files("my_json_file",full.names=TRUE),~map_df(fromJSON(txt=., simplifyVector=FALSE), fun))

out

谢谢

【问题讨论】:

  • 创建一个代表你的数据的模型,然后使用Json.NET进行反序列化/序列化

标签: c# r json tidyverse jsonlite


【解决方案1】:

探索此结构并开始使用 C# 中的 json 的一种快速方法是按照您的预期复制 json 数据包。以您的问题为例,将 json 复制到剪贴板并创建一个新的 C# 代码文件并仅编写默认命名空间,如下所示:

namespace Data
{
    // Next step will be here
}

之后,将光标放在大括号之间,点击编辑菜单,然后粘贴特殊的JSON as Classes

这将为您生成一些与您拥有的 JSON 模式相匹配的类。在这种情况下,有一个 Class1,因为它无法确定具有 toplevelsecondlevel 等属性的对象的名称。您可以为您的案例取一个更有意义的名称。

.NET 5.0 及更高版本的更新

随着 .NET 5.0 的发布,现在开箱即用的新命名空间可以像 Newtonsoft 一样轻松地以高性能方式处理 JSON。

将 Json 解析为您的对象的最简单方法是使用单行,如下所示...

var items = JsonSerializer.Deserialize<IEnumerable<MyItem>>(jsonData);

为此,您需要在 usings 中包含以下内容...

using System.Collections.Generic; // For IEnumerable<T>
using System.Text.Json;           // For JsonSerializer.*

以下是使用 Newtonsoft.Json Nuget 包的原始答案。这仍然适用于 .NET 5.0,但我为那些希望避免包含具有开箱即用功能的额外 DLL 的用户添加了新的命名空间。

使用Newtonsoft.Json的原始方法

打开包管理器控制台(如果在 VS 中看不到,请按 Ctrl+Q 并键入“包管理器控制台”)。在包管理器中,输入以下内容

Install-Package Newtonsoft.Json

在确保您已保存解决方案并指定要将该包添加到的项目作为您的默认项目后,如屏幕截图所示:

然后等待它完成。您现在可以将拥有的 JSON 反序列化到您的类中。转到您要进行处理的位置并键入以下内容...

// at the top of the file...
using Newtonsoft.Json;

// where you need to decode it...
string jsonData = GetYourJsonDataFromAFileOrAPICall(); // replace with how you get the json
var items = JsonConvert.DeserializeObject<IEnumerable<MyItem>>(jsonData);

此时,您将拥有一个代表您的 json 的 IEnumerable&lt;MyItem&gt;MyItem 是我将其重命名为 Class1)。如果您想要更具体的集合,可以将其更改为列表或数组。

【讨论】:

  • PM> 安装包 Newtonsoft.Json 安装包:未找到项目“默认”。在 line:1 char:1 + Install-Package Newtonsoft.Json + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound : (Default:String) [Install-Package], ItemNotFoundException + FullyQualifiedErrorId : NuGetProjectNotFound,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand 我试过stackoverflow.com/questions/10130333/…
  • 运行该命令时,请确保您已选择要添加包的项目。我会更新我的答案以反映这一点。看来您链接到的问题是基于不同的问题(询问时的服务器问题)
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 2018-04-30
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多