假设我有一个嵌套的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
谢谢
解决方法:
探索这种结构并在C#中开始使用json的快速方法是按您的期望复制json数据包.以问题中的内容为例,将json复制到剪贴板中并创建一个新的C#代码文件,并仅按以下方式编写默认名称空间:
namespace Data
{
// Next step will be here
}
之后,将光标放在花括号之间,单击编辑菜单,然后将特殊的JSON作为类粘贴
这将为您生成一些与您拥有的JSON模式匹配的类.在这种情况下,存在一个Class1,因为它无法确定具有toplevel,secondlevel等属性的对象的名称.您可以为案件指定一个更有意义的名称.
打开程序包管理器控制台(如果在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);
此时,您将拥有IEnumerable< MyItem> (MyItem是我重命名为Class1的名称),代表您的json.您可以将其更改为列表或数组(如果需要更具体的集合).