2014-06-29 27 views
4

我试图从Jira中提取问题并将它们放入List [Issue]中。 我想通了如何下载和解析JSON:从JSON中提取嵌套实体和值

val json = JsonParser.parse(content) 

我还可以在JSON的根中提取一些数字:

val total = (json \ "total").extract[Int] 
val maxResults = (json \ "maxResults").extract[Int] 
println("Received " + total + " from " + maxResults + " issues") 

但是,当我试图提取所有的问题清单

val issues = (json \ "issues") 
println(issues) 
issues.extract[List[Issue]] 

我收到一个错误: 异常线程 “main” net.liftweb.json.MappingException:没有可用于ID值不知道如何将JString(13604)转换为int 我不明白为什么不能将13604转换为Int。 这里是我的情况下类:

case class Issue(id: Int, 
    key: String, 
    summary: String, 
    issueTypeName: String, 
    resolutionName: Option[String], 
    resolutionDate: Option[DateTime], 
    timeSpent: Option[Int], 
    creatorName: String, 
    reporterName: String, 
    updated: DateTime, 
    created: DateTime, 
    priorityName: String, 
    description: String, 
    dueDate: Option[DateTime], 
    statusName: String, 
    assigneeName: String, 
    projectId: Int, 
    projectKey: String, 
    projectName: String, 
    timeEstimate: Option[Int], 
    ownerName: String, 
    timeOriginalEstimate: Option[Int] 
        ) 
  1. 谁能帮我解决这个问题的诠释?

  2. 此外,JSON具有嵌套元素的一些属性,如项目具有嵌套的ID,键和名称。在我提取json \ "issues"的问题之前,我看到了另一个错误 - 我相信这是因为JSON提取器不知道他需要去嵌套元素。 我怎样才能让他知道呢? 我想我可以做这样的事情:

    的(问题< - 问题){ VAL ID =(问题\ “ID”)提取物[INT] 的println(ID) 。}

并使用issue \ "project" \ "id"嵌套项目,然后创建新的Case类对象,并将其添加到列表var(可变,但我不知道如何以其他方式做)。但我收到编译时错误:

Error:(53, 16) value foreach is not a member of net.liftweb.json.JsonAST.JValue 
     for(issue <- issues) { 
        ^

我是新来斯卡拉和整体的Java基础架构和框架,所以我会很感激的的代码样本。


PS。当我在我的案件类改变ID为String现在我得到另一个错误:

Exception in thread "main" net.liftweb.json.MappingException: No usable value for summary Did not find value which can be converted into java.lang.String 

这是因为“摘要”嵌套入“场”。所以,我的第二个问题仍然是实际的: 2.我如何处理嵌套值?

和新的相关问题: 3.如果我想使用Int为id - 我该如何转换它?

回答

2

我已经找到解决自己:

val issues = (json \\ "issues").children 
for (issue <- issues) { 
     val item = new Issue (
        (issue \ "id").extract[String].toInt, 
        (issue \ "fields" \ "summary").extract[String], 
        (issue \ "fields" \ "issuetype" \ "name").extract[String], 
        (issue \ "fields" \ "resolutiondate").extractOrNone[String] match { 
         case None => None 
         case Some (null) => None 
         case Some (dt) => Some (dateTimeFormatter.withZoneUTC().parseDateTime (dt)) 
        }, 
     etc...) 
} 

在这种情况下,我继续使用单例类(我定义我自己的需求结构),并解析嵌套的JSON性能进去,在飞行中做类型转换需要的地方。

4

这是因为json中的id字段以字符串形式出现(“id”:“10230”https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+Query+issues),liftjson自动转换为JString。在您的案例类中,您需要将id字段设为String。

2)用例类来处理嵌套的json。如果你有一个JSON看起来像这样

{ 
    "id": "10230", 
    "fields": { 
    "summary": "testing" 
    } 
} 

,你将需要两个case类

case class Issues(
    id: String, 
    fields: Summary 
) 

case class Summary(
    summary: String 
) 

3)我不认为你可以将提取物中的方法来诠释,因为JSON结构定义它作为一个字符串。在提取值后,转换必须发生。

+1

感谢您的答复 - 这是有帮助的。但是现在我收到一个错误:线程“main”中的异常net.liftweb.json.MappingException:摘要没有可用的值 找不到可以转换为java.lang.String的值 - 这是因为“summary”是嵌套的进入“田野”。 1.我如何处理嵌套值? 2.如果我需要使用Int作为id - 我如何转换它? –

+0

@KonstantinTrunin DId你在上面的评论中提到了你提到的问题的解决方案? TIA – texens