JSON解码器显示空白列表,但是所有内容均已正确编码。我从服务器获得一个json数组,在Xcode控制台中它仍然显示一个空数组。
News(news: [])
来自服务器的当前响应是有效的json数组:
{"news":[{"info_id":"unique id","title":"some title","description":"some description","date":"2019-07-10","time":"10:23:00"}]}
我解析json的结构是:
struct News: Codable {
let news = [Info]()
struct Info: Codable {
let infoId: String
let title: String
let description: String
let date: String
let time: String
private enum CodingKeys: String, CodingKey {
case infoId = "info_id"
}
}
}
我尝试用该代码解码帖子数组:
let decoder = JSONDecoder()
let news: News = try decoder.decode(News.self, from: data)
print("\(news)")
解决方案:let news = [Info]()
更改为var news = [Info]()
答案 0 :(得分:1)
尝试一下。
struct BaseNews: Codable {
let news: [News]
}
// MARK: - News
struct News: Codable {
let infoID, title, newsDescription, date: String
let time: String
enum CodingKeys: String, CodingKey {
case infoID = "info_id"
case title
case newsDescription = "description"
case date, time
}
}
let decoder = JSONDecoder()
let news: News = try decoder.decode(BaseNews.self, from: data)
更新:根据您的评论
解码时我无法将新闻转换为新闻,因为它可能是数组中的更多对象
Codables协议需要在其主体内部明确声明属性,因为您不能使用相同的密钥来解码多个类型,或者缺少密钥,因此要么实现完整的JSON
解码,键,或浏览json数组,对其进行切片,或执行所需的任何操作以获取所需数据的输出以进行解码。
现在,通常在同一数组中有多个对象类型时,应该有某种方法可以分辨出哪一个是什么,或者至少有一个公共键和对象之间的可空值而不会丢失任何键。
还有一种先进的解码方法,例如从其解码器中覆盖一致方的初始化程序,并手动创建一个容器并解码每个键,这将使我们能够以自己喜欢的方式操纵数据类型,键路径。
侧面说明:网络api返回一个 包含多个对象类型的数组
答案 1 :(得分:0)
您已经在结构中初始化OncePerRequestFilter
的数组,这就是为什么要获取空数组的原因。您只需要更改
public class AuthenticationFilter extends OncePerRequestFilter {
protected void doFilterInternal(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, FilterChain filterChain)
throws ServletException, IOException {
....
.....
httpServletRequest.setAttribute("testing","testing");
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
@RequestMapping(
value = "/index/{index:.+}",
method = RequestMethod.GET,
produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
public ResponseEntity<RestApiModelResponse> getIndex(
@PathVariable String index,
HttpServletRequest httpServletRequest)
throws Exception {
var test = httpServletRequest.getAttribute("testing");
}
收件人
[Info]
您的结构应如下所示:
var news = [Info]()
你很好。