문제

나는 리프트를 사용하여 케이스 클래스로 마샬링하려고 시도하기 전에 키/값 목록이 포함되어 있는지 확인하고 싶습니다.데이터가 중첩 될 수 있습니다.

예를 들어:

{ 
 "name": "stack",
 "desc": "desc",
 "age": 29,
 "address": {
  "street": "123 elm", 
  "postal_code": 22222,
  "city": "slc",
 }
}

"이름","나이"및"주소\거리"에 대한 값이 포함되어 있는지 확인할 수있는 방법은 무엇입니까?다른 모든 필드는 선택 사항이라고 가정합니다.

내가 명백한 것을 놓치고 있다면 미안하지만,이 같은 것이 전에 해결되었다고 의심한다.

그런데,사람이 질서 시도? https://github.com/nparry/orderly4jvm

도움이 되었습니까?

해결책

내가 그것을 볼 때 당신은 몇 가지 옵션을 가지고:

  1. 당신은"낮은 수준의 풀 파서"를 사용할 수 있습니다. 이 페이지)를 통해 여러분이 걱정하는 모든 밭을 잡을 수 있습니다.최종 토큰이 발생하는 시점에서 원하는 필드를 모두 얻지 못한 경우 예외를 던집니다.필요한 필드가 있는 경우 개체를 만듭니다.

    프로:이것은 한 번만 파싱됩니다.그것은 리프트를 사용하는 가장 높은 성능의 방법입니다.

    :당신은 부서지기 쉬운 손으로 압연 소프트웨어를 만들었습니다.

  2. 당신은 리프트를 사용할 수 있습니다. parse 메서드("구문 분석"에 대한 검색 이 페이지그리고 그 다음엔 엑스패스 같은 표현식(엑스패스+호프스)을 검색합니다. 이 페이지)에서 필수 필드가 있는지 여부를 결정합니다.그런 경우 해당 필드를 생성자에 전달하여 개체를 만듭니다.

    프로:적은 손보다 압연#1.데이터를 한 번만 구문 분석합니다.

    :이것은#2 만큼 빠르지 않습니다.

  3. #1 또는#2 의 방법을 사용하여 필수 필드가 있는지 확인하십시오.만약 그렇다면,리프트-제이슨의 역직렬화를 사용하세요. 이 페이지)를 만들고,객체를 만들 수 있습니다.

    프로: 나는 정말로 여기에서 스트레칭하고 있습니다... 당신은 많은 데이터가 나쁜 것으로 예상하는 경우,당신은 리프트 역 직렬화의 다소 더 헤비급 과정을 입력하기 전에 그것을 결정할 수있을 것입니다

    :데이터가 유효한 경우 데이터를 두 번 구문 분석했습니다.

  4. 그냥 리프트-제이슨의 역직렬화를 사용하십시오("직렬화"를 찾으십시오 이 페이지).어떤 필드가 필요한지 알아내기 위해 반사를 사용하는 것을 제외하고는#2 에 설명된 것을 거의 수행합니다.

    프로:이것은 가장 유지 관리 가능한 솔루션입니다

    :#1 과#2 보다 느립니다.

내 추천:최상의 성능이 절대적으로 필요하지 않는 한#4 를 사용하십시오.당신이 정말로 속도에 대한 필요성이있는 경우,#1 을 사용합니다.#1 또는#2 스타일 솔루션을 사용하는 또 다른 이점은 데이터에 홀수 강제 강제 작업을 수행 할 수 있다는 것입니다.

다른 팁

이것은 나를 위해 일했습니다 : json to scala의 XML 및 옵션 () 결과

여기의 이전 질문에서 정말로 간단한 컷 및 붙여 넣기가 있습니다.귀하의 요구 사항과 완벽한 일치가 아니라 몇 가지 아이디어를 줄 수 있습니다.

import util.parsing.json.JSON._

object JsonSoap {
  def main(args: Array[String]) {
    val x = parseFull("""{"name":"Joe","surname":"SOAP"}""")

    val y = x collect {
      case m: Map[_, _] => m collect {
        case (key: String, value: String) => key -> value
      }
    }

    val z = for (m <- y; name <- m.get("name"); surname <- m.get("surname"))
    yield {
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
          <Person>
            <Name>{name}</Name>
            <Surname>{surname}</Surname>
          </Person>
        </soap:Body>
      </soap:Envelope>
    }

    println(z)
  }
}
.

다음을 살펴 보았습니까 :

표준 스칼라를 사용하여 스칼라에서 JSON 파스

JSON 구문 분석 및 반복

간단한 JSON XML

기본적으로 스키마에 대한 유효성을 검사하므로 각 레벨이 올바른 요소가있는 JSONAST 유효성 검사를 사용하여 객체와 일치하는 설명자를 만듭니다.유효성 검사기를 구조하는 방법은 귀하에게 달려 있지만 AST와 유효성 검사기를 함께 할 수 있도록 유형을 미러링합니다.

이 JSON 파서 / 유효성 검사기를 개발했습니다. https://github.com/higherstate/jameson

우리 팀은 질서 정연하게 보입니다.우리가 사용하고있는 JSON 객체의 경우, 질서 정연하게 그들을 충분히 설명 할 수 있습니다.나는 우리가 그들을 사용할 것이라고 생각한다.

귀하가 언급 한 질서 정연한 라이브러리 : https://github.com/nparry/OrderLy4JVM 아주 좋은 것 같습니다.유효성 검사가 실패 할 때 괜찮은 오류 메시지를 제공합니다.

JSON 스키마, 특히 Java 라이브러리 JSON 스키마 유효성 검사기를 사용하여 보았습니다. https://github.com/fge/json-schema-validator

오류 메시지는 설명 적이지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top