2017-12-28 4 views
0

최근에 나는 Spray-json의 소스 코드를 읽었습니다. 나는 JsonFormat.scala에서 다음과 같은 계층 구조 관계, 코드는 아래를 참조하시기 바랍니다 주목spray-json이 RootJsonFormat에서이 계층 구조 방식을 적용하는 이유는 무엇입니까?

/** 
* A special JsonFormat signaling that the format produces a legal JSON root 
* object, i.e. either a JSON array 
* or a JSON object. 
*/ 
trait RootJsonFormat[T] extends JsonFormat[T] with RootJsonReader[T] with RootJsonWriter[T] 

, 내가 계층 구조의 아래 그림 그리기보다 편리 혼란을 표현하기 : 내 제한에 따라

enter image description here

을 스칼라에 대한 지식, 나는 위의 코드에서 JsonFormat[T] with을 제거해야한다고 생각합니다. 그럼를 분무 JSON의 저장소를 복제하고, 그럼 난 (package/compile 명령을 사용하여) SBT에서 컴파일 코드 JsonFormat[T] with

trait RootJsonFormat[T] extends RootJsonReader[T] with RootJsonWriter[T] 

을 언급하며 컴파일 과정에 전달하고 성공적으로 spray-json_2.11-1.3.4.jar를 생성합니다. 내가 SBT의 test 명령을 통해 테스트 케이스를 실행할 때

enter image description here

그러나, 그것은 실패했습니다.

enter image description here

그래서 나는 이유를 알고 싶습니다. 미리 감사드립니다.

답변

1

OOP의 관점에서 생각하지 말 것을 제안합니다. 타입 클래스의 관점에서 생각해보십시오. 어떤 엔티티를 동시에 직렬화 및 직렬화 해제해야하는 경우 JsonWriterJsonReader을 모두 포함하는 유형 클래스 JsonFormat이 있습니다. 이 기능은 두 가지 유형의 클래스 인스턴스를 검색 할 필요가 없으므로 편리합니다. 그러나이 접근 방식이 작동하려면 JsonFormat 유형 클래스의 인스턴스가 있어야합니다. 이것이 계층 구조에서 버릴 수없는 이유입니다. 예를 들어 :

def myMethod[T](t: T)(implicit format: JsonFormat[T]): Unit = { 
    format.read(format.write(t)) 
} 

이 방법은 작업 할 경우

제대로 JsonFormat의 직계 후손과 특정 유형의 T에 대한 그것의 구체적인 암시 예를이 있어야한다.

UPD : (둘 다 필요로 할 때 경우)JsonFormat 형 클래스의 인스턴스를 생성함으로써, 당신은 자동으로 JsonWriterJsonReader 타입의 클래스 인스턴스를 얻을. 따라서 이것은 상용구를 줄이는 방법이기도합니다.

+0

설명해 주셔서 감사합니다. 'RootJsonFormat'이 줄어들 수 있다고 생각합니까? 왜냐하면'JsonFormat'은'JsReader'와'JsWriter'의 두 가지 용량을 소유하고 있기 때문입니다. – xyz

+1

네,'RootJsonFormat'은 약간 중복 된 것 같습니다. 그럼에도 불구하고 그것 자체의 목적을 수행합니다. JsonFormat은 integer 나 string과 같은 프리미티브를 포함하여 ANY 엔티티의 직렬화 동작을 정의합니다. 'RootJsonFormat'은 다른 한편으로는이 형식이 배열'[]'또는 JSON 객체'{}'와 같은 * 루트 * 객체를 생성한다는 것을 나타내는 * 마커 *의 목적을 제공합니다. 여기에 설명되어 있습니다 : https://github.com/spray/spray-json/blob/7277ddc103d345e2ca42d6f39a21bbe8c453049b/src/main/scala/spray/json/JsonFormat.scala#L67-L71. 그래서'RootJsonFormat'은'JsonFormat'의 부분 집합이지만 더 엄격한 보증을합니다. – Zyoma

+0

도움 주셔서 감사합니다 @Zyoma – xyz