1

関連する名前に基づいて Id を見つける必要があります。私のプログラムは、API への REST 呼び出しを行います。API は結果を JSON 形式で返します。名前は一意なので、それを使用して Id 値を取得したいと思います。... には何でも含めることができ、いくつかの {Such}Id キーが含まれていることに注意してください。Id は任意の数の {...{...{...}...}...} でネストできます。ID は常に名前の直前にあります。

注: ... は、プライバシー上の理由から表示できないコードです。コード自体 (プライベート データを除外する前) は、Advanced Rest Client によって返された REST 呼び出しの結果であり、http://jsonlint.com/で有効な JSON であることが検証されています。

コードは次のように返されます。

{
  Id: "d5a94d1a-afb7-4e1d-ae0d-a22e01393666"
  ProjectId: "ed61c45a-f208-4115-8584-a21a00c51ac0"
  Name: "Automated Runs"
  OrderNumber: 0
  Expands: [3]
    0:  "Children"
    1:  "Parent"
    2:  "Project"
    ...
    scripts: [4]
    0:  {
      Id: "0b70a55c-5e68-4b27-bfcf-a22f00c5dc48"
      Name: "3816"
      PackageId: "d5a94d1a-afb7-4e1d-ae0d-a22e01393666"
      ProjectId: "ed61c45a-f208-4115-8584-a21a00c51ac0"
      ...
      Expands: [6]
      0:  "Assignments"
      1:  "Attachments"
      2:  "FieldControls"
      3:  "FieldValues"
      4:  "Package"
      5:  "Steps"
      ...
    1:  {
      Id: "14e5c663-0d5a-46bb-ac48-a22f00c15998"
      Name: "3814"
      PackageId: "d5a94d1a-afb7-4e1d-ae0d-a22e01393666"
      ProjectId: "ed61c45a-f208-4115-8584-a21a00c51ac0"
      ...
      Expands: [6]
      0:  "Assignments"
      1:  "Attachments"
      2:  "FieldControls"
      3:  "FieldValues"
      4:  "Package"
      5:  "Steps"
      ...
    2:  {
      Id: "00d52fcd-b611-4f69-aeb6-a22f00c263a9"
      Name: "3815"
      ProjectId: "ed61c45a-f208-4115-8584-a21a00c51ac0"
      ...
      Expands: [6]
      0:  "Assignments"
      1:  "Attachments"
      2:  "FieldControls"
      3:  "FieldValues"
      4:  "Package"
      5:  "Steps"
      ...

    3:  {
      Id: "4d3a6132-8497-4b6b-a064-a22f00c669ff"
      Name: "3817"
      ...
      Expands: [6]
      0:  "Assignments"
      1:  "Attachments"
      2:  "FieldControls"
      3:  "FieldValues"
      4:  "Package"
      5:  "Steps"
      ...
}

私が試したことには、正規表現(私はそれに慣れておらず、いくつかの問題があります)と単純な文字列分割が含まれます。私は文字列分割を機能させていますが、セミハードコーディングされています。

私が欲しいのは次のようなものです:

def getID(myJSON:String, myName:String){
  val pattern = "\"Id\": \"*\",\r\n\"Name\":\"" + myName + "\",\""
  get the id (*) from result using pattern
}

または、それをジェネリックに変換することをお勧めします。

def getID(myJSON:String, myValue:String, searchKey:String, findKey:String){
  val pattern = { ... findKey: *...} in the inner most  { ... searchKey: * ...} scope
  get the id (*) from result using the pattern in the found {...searchKey...} scope
}

どちらも素晴らしく、非常に高く評価されます。私の現在のコードは次のようになります。

result.split("Id\": \"")(3).split("\"")(0)

きれいかもしれませんが、事故の余地がたくさんあります。Id は、カウントを正しく設定しないなどのユーザーによって作成される可能性があります...

ありがとう、エリック・ストーン

4

1 に答える 1

1

json4sでfor内包を使ってみてはどうですか

scala> :paste
// Entering paste mode (ctrl-D to finish)

  import org.json4s._
  import org.json4s.native.JsonMethods._

  val json = """
      {
        "a": {
          "Id": "1",
          "Name": "Name1",
          "b": {
            "Id": "2",
            "Name": "Name2",
          }
        }
      }
    """


  def getId(json: String, name: String) = {
    val res = for {
      JObject(child) <- parse(json)
      JField("Name", JString(n)) <- child
      JField("Id", JString(id)) <- child
      if n == name
    } yield id

    res.headOption
  }

// Exiting paste mode, now interpreting.

scala> getId(json, "Name1")
res4: Option[String] = Some(1)

scala> getId(json, "Name2")
res5: Option[String] = Some(2)
于 2013-09-05T00:19:10.663 に答える