C#中如何解析JSON而不使用R

3
假设我有一个嵌套的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代码,可以将其解析为一个漂亮的数据框(除了最后一个)。如果能够修复最后一个问题,那将是一个额外的奖励。
那么使用C#的巧妙替代会是什么样子呢?这不是我以前编过的东西,所以不知道从哪里开始。
最终目标是将嵌套的JSON导出为CSV,多个带有主键/外键的CSV文件可在需要时合并。
(保留HTML标记)
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

谢谢


1
创建一个代表您的数据的模型,然后使用 Json.NET 进行反序列化/序列化。 - maccettura
1个回答

4

一个快速探索这个结构并开始使用C#处理json的方法是将您期望的json数据包复制下来。以您在问题中提供的内容为例,将json复制到剪贴板中,并创建一个新的C#代码文件,只编写默认命名空间,如下所示:

namespace Data
{
    // Next step will be here
}

接下来,将光标放在花括号之间,点击编辑菜单,然后选择“特殊粘贴”,JSON 作为类

这将为您生成与您的 JSON 模式匹配的一些类。在这种情况下,由于无法确定具有 toplevelsecondlevel 等属性的对象的名称,因此会生成 Class1。您可以为其指定更有意义的名称。

.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并键入“Package Manager Console”)。在包管理器中,键入以下内容
Install-Package Newtonsoft.Json

确保你已经保存了你的解决方案,并将你想要添加该软件包作为默认项目的项目指定为像屏幕截图中一样:

Screenshot of Package Manager Console with default project selected and highlighted.

然后等待操作完成。现在,您将能够将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<MyItem>MyItem 是我将 Class1 重新命名后的名称)。如果你想要更具体的集合,可以将其更改为列表或数组。


PM>安装程序包Newtonsoft.Json 安装程序包:未找到项目“默认”。 At line:1 char:1
  • Install-Package Newtonsoft.Json
  • + CategoryInfo : ObjectNotFound: (Default:String) [Install-Package], ItemNotFoundException + FullyQualifiedErrorId : NuGetProjectNotFound,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand
我已经尝试了https://dev59.com/2mLVa4cB1Zd3GeqPyKGH
- Mikey
运行该命令时,请确保已选择要将软件包添加到的项目。我会更新我的答案以反映这一点。而且,似乎您链接的问题基于不同的问题(在提问时是服务器问题)。 - Fabulous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接