修正:JSON无法从php解码数组

时间:2019-06-16 07:46:15

标签: php ios json swift

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]()

2 个答案:

答案 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]()

你很好。