如何将没有相同长度json对象的json文件转换为csv

如何将没有相同长度json对象的json文件转换为csv,json,r,csv,Json,R,Csv,我有一个json文件,我想把它转换成csv格式 我面临的问题是,文件中的每个json对象的转换列长度与我的不同。例如,一个对象有49列,下一个对象有50列 我在这里提供了一个2个数据的示例,其中第一个没有creator.slug,但下一个有creator.slug,因此存在数据问题。问题是,该过程创建了所有50列,但对于没有值creator.slug的对象,它将采用下一个价格 { "id": 301852363, "name": "Song of the Sea",

我有一个json文件,我想把它转换成csv格式

我面临的问题是,文件中的每个json对象的转换列长度与我的不同。例如,一个对象有49列,下一个对象有50列

我在这里提供了一个2个数据的示例,其中第一个没有creator.slug,但下一个有creator.slug,因此存在数据问题。问题是,该过程创建了所有50列,但对于没有值creator.slug的对象,它将采用下一个价格

{
      "id": 301852363,
      "name": "Song of the Sea",
      "blurb": "One evening, two shows: SIRENS and The Girl From Bare Cove. Building a community. Giving voice to survivors of sexual violence.",
      "goal": 5000,
      "pledged": 671,
      "state": "live",
      "slug": "song-of-the-sea",
      "disable_communication": false,
      "country": "US",
      "currency": "USD",
      "currency_symbol": "$",
      "currency_trailing_code": true,
      "deadline": 1399293386,
      "state_changed_at": 1397133386,
      "created_at": 1396672480,
      "launched_at": 1397133386,
      "backers_count": 20,
      "photo": {
        "full": "https://s3.amazonaws.com/ksr/projects/939387/photo-full.jpg?1397874930",
        "ed": "https://s3.amazonaws.com/ksr/projects/939387/photo-ed.jpg?1397874930",
        "med": "https://s3.amazonaws.com/ksr/projects/939387/photo-med.jpg?1397874930",
        "little": "https://s3.amazonaws.com/ksr/projects/939387/photo-little.jpg?1397874930",
        "small": "https://s3.amazonaws.com/ksr/projects/939387/photo-small.jpg?1397874930",
        "thumb": "https://s3.amazonaws.com/ksr/projects/939387/photo-thumb.jpg?1397874930",
        "1024x768": "https://s3.amazonaws.com/ksr/projects/939387/photo-1024x768.jpg?1397874930",
        "1536x1152": "https://s3.amazonaws.com/ksr/projects/939387/photo-1536x1152.jpg?1397874930"
      },
      "creator": {
        "id": 1714048992,
        "name": "Maridee Slater",
        "slug": "maridee",
        "avatar": {
          "thumb": "https://s3.amazonaws.com/ksr/avatars/996153/DSC_0310.thumb.jpg?1337713264",
          "small": "https://s3.amazonaws.com/ksr/avatars/996153/DSC_0310.small.jpg?1337713264",
          "medium": "https://s3.amazonaws.com/ksr/avatars/996153/DSC_0310.medium.jpg?1337713264"
        },
        "urls": {
          "web": {
            "user": "https://www.kickstarter.com/profile/maridee"
          },
          "api": {
            "user": "https://api.kickstarter.com/v1/users/1714048992?signature=1398256877.e6d63adcca055cd041a5920368b197d40459f748"
          }
        }
      },
      "location": {
        "id": 2459115,
        "name": "New York",
        "slug": "new-york-ny",
        "short_name": "New York, NY",
        "displayable_name": "New York, NY",
        "country": "US",
        "state": "NY",
        "urls": {
          "web": {
            "discover": "https://www.kickstarter.com/discover/places/new-york-ny",
            "location": "https://www.kickstarter.com/locations/new-york-ny"
          },
          "api": {
            "nearby_projects": "https://api.kickstarter.com/v1/discover?signature=1398256786.89b2c4539aeab4ad25982694dd7e659e8c12028f&woe_id=2459115"
          }
        }
      },
      "category": {
        "id": 17,
        "name": "Theater",
        "slug": "theater",
        "position": 14,
        "urls": {
          "web": {
            "discover": "http://www.kickstarter.com/discover/categories/theater"
          }
        }
      },
      "urls": {
        "web": {
          "project": "https://www.kickstarter.com/projects/maridee/song-of-the-sea"
        }
      }
    },
    {
      "id": 967108708,
      "name": "Good Bread Alley",
      "blurb": "A play by April Yvette Thompson. A Gullah Healer Woman and an Afro-Cuban Priest forge a new world of magic & dreams in Jim Crow Miami.",
      "goal": 100000,
      "pledged": 33242,
      "state": "live",
      "slug": "good-bread-alley",
      "disable_communication": false,
      "country": "US",
      "currency": "USD",
      "currency_symbol": "$",
      "currency_trailing_code": true,
      "deadline": 1399271911,
      "state_changed_at": 1396334313,
      "created_at": 1393278556,
      "launched_at": 1396334311,
      "backers_count": 261,
      "photo": {
        "full": "https://s3.amazonaws.com/ksr/projects/883489/photo-full.jpg?1397869394",
        "ed": "https://s3.amazonaws.com/ksr/projects/883489/photo-ed.jpg?1397869394",
        "med": "https://s3.amazonaws.com/ksr/projects/883489/photo-med.jpg?1397869394",
        "little": "https://s3.amazonaws.com/ksr/projects/883489/photo-little.jpg?1397869394",
        "small": "https://s3.amazonaws.com/ksr/projects/883489/photo-small.jpg?1397869394",
        "thumb": "https://s3.amazonaws.com/ksr/projects/883489/photo-thumb.jpg?1397869394",
        "1024x768": "https://s3.amazonaws.com/ksr/projects/883489/photo-1024x768.jpg?1397869394",
        "1536x1152": "https://s3.amazonaws.com/ksr/projects/883489/photo-1536x1152.jpg?1397869394"
      },
      "creator": {
        "id": 749318998,
        "name": "April Yvette Thompson",
        "avatar": {
          "thumb": "https://s3.amazonaws.com/ksr/avatars/9751919/kick_thumb.thumb.jpg?1396128151",
          "small": "https://s3.amazonaws.com/ksr/avatars/9751919/kick_thumb.small.jpg?1396128151",
          "medium": "https://s3.amazonaws.com/ksr/avatars/9751919/kick_thumb.medium.jpg?1396128151"
        },
        "urls": {
          "web": {
            "user": "https://www.kickstarter.com/profile/749318998"
          },
          "api": {
            "user": "https://api.kickstarter.com/v1/users/749318998?signature=1398256877.af4db50c53f93339b05c7813f4534e833eaca270"
          }
        }
      },
      "location": {
        "id": 2459115,
        "name": "New York",
        "slug": "new-york-ny",
        "short_name": "New York, NY",
        "displayable_name": "New York, NY",
        "country": "US",
        "state": "NY",
        "urls": {
          "web": {
            "discover": "https://www.kickstarter.com/discover/places/new-york-ny",
            "location": "https://www.kickstarter.com/locations/new-york-ny"
          },
          "api": {
            "nearby_projects": "https://api.kickstarter.com/v1/discover?signature=1398256786.89b2c4539aeab4ad25982694dd7e659e8c12028f&woe_id=2459115"
          }
        }
      },
      "category": {
        "id": 17,
        "name": "Theater",
        "slug": "theater",
        "position": 14,
        "urls": {
          "web": {
            "discover": "http://www.kickstarter.com/discover/categories/theater"
          }
        }
      },
      "urls": {
        "web": {
          "project": "https://www.kickstarter.com/projects/749318998/good-bread-alley"
        }
      }
    }
这是我运行的代码

#open the json file
require(RJSONIO)
require(rjson)
library("rjson")
filename2 <- "C:/Users/Desktop/in.json"
json_data <- fromJSON(file = filename2)

#unlist the json because it has a problem
unlisted <- unlist(unlist(json_data,recursive=FALSE),recursive=FALSE)

use to fill the NA but as I can understand now it is for already existed nulls http://stackoverflow.com/questions/16947643/getting-imported-json-data-into-a-data-frame-in-r/16948174#16948174
unlisted <- lapply(unlisted, function(x) {
  x[sapply(x, is.null)] <- NA
  unlist(x)
})

json <- do.call("rbind", unlisted)
这里是我将尝试在输出csv中包含的列列表:

id
name
blurb
goal
pledged
state
slug
disable_communication
country
currency
currency_symbol
currency_trailing_code
deadline
state_changed_at
created_at
launched_at
backers_count
creator.id
creator.name
creator.slug
location.id
location.name
location.slug
location.short_name
location.displayable_name
location.country
location.state
category.id
category.name
category.slug
category.position

看起来这里有一个非常类似的问题(有答案,但不是纯R):

然而,由于您似乎确实需要“宽CSV”格式的大部分(如果不是全部的话)JSON,因此您可以使用
fromJSON
from
jsonlite
rbindlist
from
data.table
(这可以让您获得
fill=TRUE
参数来很好地处理不均匀的列表)和
unlist

library(jsonlite)
library(data.table)

# tell fromJSON we want a list back

json_data <- fromJSON("in.json", simplifyDataFrame=FALSE)

# iterate over the list we have so we can "flatten" it then
# covert it back to a data.frame-like object

dat <- rbindlist(lapply(json_data, function(x) {
  as.list(unlist(x))
}), fill=TRUE)
library(jsonlite)
库(数据表)
#告诉fromJSON我们想要一个列表

json_数据您不需要RJSONIO和rjson…您只需要其中一个。@Thomas谢谢您的评论。是的,我用这个来测试我离开的原因。很抱歉,您不太可能真的想要或需要将每个JSON对象完全扩展为一个非常宽的data.frame。您希望/需要从中获取哪些字段?@hrbrmstr我编辑了这个问题,假设是一个完整的列列表,可以提取与json格式相关的列,然后是一个列数少于我真正想要的初始列数的列表。非常感谢您的回答。我试图处理的数据在第一级有一种奇怪的格式。这里我有一个片段,有一个“total_hits”,我不需要它,并且产生了一个错误的格式。我在问题中提到的流程未列出
library(jsonlite)
library(data.table)

# tell fromJSON we want a list back

json_data <- fromJSON("in.json", simplifyDataFrame=FALSE)

# iterate over the list we have so we can "flatten" it then
# covert it back to a data.frame-like object

dat <- rbindlist(lapply(json_data, function(x) {
  as.list(unlist(x))
}), fill=TRUE)