2016-10-06 2 views
5

따라서 제네릭 형식을 다루고 있으므로 특정 사례 클래스를 사용할 수 없습니다. 그런 다음 일반 객체를 직렬화 및 비 직렬화하는 일반 유틸리티를 만들었습니다.json4s 제네릭 형식을 serialize 및 deserialize

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

object JsonHelper { 
    def json2Object[O](input: String) : O = { 
    parse(json4s.string2JsonInput(input)).asInstanceOf[O] 
    } 
    def object2Json[O](input: O) : String = { 
    write(input).toString 
    } 
} 

컴파일러는 오류가 발생합니다 :

No JSON serializer found for type O. Try to implement an implicit Writer or JsonFormat for this type. write(input).toString

이 런타임에 발생해야하지만, 왜이 컴파일시에 던진거야?

+0

어떻게 생각하니? 'O'가 무엇이든 될 수 있다면, json4는 모든 경우에 무엇을해야하는지 알 것입니다. Writer 나 JsonFormat이 O에 정의되어있는 한 당신의'write (input) '일은 작동 할 것입니다. 컴파일 시간에 이것은 찾을 수 없습니다 – mfirry

+1

@mfirry 그래서 jackson이 java 객체로 어떻게 작동 할 수 있습니까? 반사를 올바르게 사용합니까? 왜 스칼라와 다른가? –

답변

7

을, 당신은 "요청 그래서 잭슨이 자바 객체로 어떻게 작동 할 수 있을까요? 리플렉션을 사용합니까? 스칼라와 다른 점은 무엇입니까? "라는 질문을 던졌습니다.

가져온 json4s "native"시리얼 라이저는 컴파일시 반영을 사용하여 Writer을 만듭니다.

Jackson은 런타임 리플렉션을 사용하여 동일한 작업을 수행합니다.

컴파일 타임 버전이 더 효율적입니다. 런타임 버전은보다 유연합니다.

컴파일 타임 버전을 사용하려면 컴파일러에서 직렬화 할 개체의 선언 된 유형을 기반으로 올바른 Writer을 선택할 수있는 충분한 정보가 있어야합니다. 이것은 당신이 제안한 것과 같은 매우 일반적인 작가 방식을 배제 할 것입니다. 해당 버전의 코드를 수정하는 방법에 대한 @ TimP의 대답을 참조하십시오.

런타임 버전을 사용하려면 org.json4s.jackson.JsonMethods._ 패키지를 통해 Jackson을 사용할 수 있습니다. https://github.com/json4s/json4s#jackson

1

이 예에서는 다른 jvm 언어와 마찬가지로 스칼라는 일반 유형과의 거래를 수행하며 컴파일시에는 type erasing 메커니즘을 사용합니다 (컴파일시 오류 메시지는 일반에 대한 메시지를 포함하지 않을 수 있습니다). 두 방법의 서명이 조각을 추가합니다 :

(implicit tag: ClassTag[T]) 

it's 유사한 일반적인 예는 당신에게, 그러나 잭슨과 함께. HTH

5

게시 한 컴파일러 오류는 this location in the json4s code에서 발생합니다. 호출중인 write 함수는 암시적인 JSON Writer을 사용합니다.이 메서드는 메서드에서 임의의 형식을 취할 수 있습니다. 암시 적 인수가 명시 사람이 같은 방식으로 컴파일하기 때문에 컴파일 타임에 잡은 - 당신이 한 것처럼는 다음과 같습니다

def f(a: Int, b: Int) = a + b 
f(5) // passed the wrong number of arguments 

나는 문제가 정확히보고 여기 호출중인 write 방법의 비트가 있어요 - - json4s 라이브러리는 꽤 크고 모든 것이 과부하입니다. 사용중인 신고 된 write 방법을 붙여 넣을 수 있습니까? 는 위처럼 보이는 경우

def write[T](value: T)(implicit writer: Writer[T]): JValue 

은, 그래서 당신의 방법에서 암시 작가 매개 변수를 포함하여보십시오 : 그것은 거의 확실이 같은 서명이 위의 댓글에서

object JsonHelper { 
    def json2Object[O](input: String)(implicit reader: Reader[O]) : O = { 
    parse(json4s.string2JsonInput(input)).asInstanceOf[O] 
    } 
    def object2Json[O](input: O)(implicit writer: Writer[O]) : String = { 
    write(input).toString 
    } 
} 
관련 문제