2017-09-18 8 views
0

내 예제 코드는 다음과 같습니다 :kotlin JS에서 JSON.stringify를 통해 JSON 문자열에 대한 맵을 직렬화하는 방법?

fun main(args: Array<String>) { 
    val testData = mapOf<String, Any>(
     "name" to "albert", 
     "age" to 26, 
     "work" to listOf("1", "2", "3") 
    ) 

    var value = JSON.stringify(testData, { _, value -> value.toString() }, 2) 

    println(value) 
} 

결과는 "{name=albert, age=26, work=[1, 2, 3]}"입니다. 속성 이름과 문자열 값을 둘러싼 큰 따옴표가 모두 누락 된 것으로 보입니다.

나는 그럼, 어떻게이 문제를 해결하기 위해 KotlinJS 오히려

Kotlin보다 사용 해요?

+0

내가 코 틀린 함께 시간을 연주하고 ... 난 잘 해요,하지만 실제로 100 % 확인 : 귀하의 예는 다음과 같은 방법을 쓸 수있다 이 코드가하는 일은 java'Map.toString()'을 호출 한 다음이 값을 js'JSON.stringify'에 제공하므로' "{name = albert, age = 26, work = [1, 2, 3]} "'는 json이 아니지만 map.toString()과'JSON.stringify'는이 문자열 주위에 따옴표를 추가합니다. 당신이 할 수있는 일은 java의 jackson이나 gson으로 테스트 데이터를 변환하고 JSON을 잊어 버리거나 https://github.com/Kotlin/kotlinx.serialization을 시도해 볼 수 있습니다. 또한 https : //discuss.kotlinlang을 살펴보십시오. org/t/kotlin-serialization/2063/25 – varren

+0

@varren 도움을 주셔서 대단히 감사합니다. 그것은 완전한 KotinJS 환경이므로 JVM 세계에서 이점을 얻을 수는 없습니다 :(println (JSON.stringify (testData.toString()))'을 시도했지만 여전히 인용 부호가 없습니다. 공유하는 게시물에 따르면, serialization에서 일은 KotlinJS 세계에 아직 도착하지 않았다. 내가 말했던 것처럼 제 3 자 라이브러리를 조사 할 것이다. –

답변

1

사실, JSON.stringify의 결과를 얻지 못합니다. 대신 결과는 kotlin.collections.HashMap.toString입니다. 이유는 다음과 같습니다. 두 번째 매개 변수로 람다를 전달합니다 : { _, value -> value.toString() }. 이것은 toString() 함수를 사용하여 전체 맵을 문자열로 변환합니다. 그리고 HashMap.toString 함수는 그러한 문자열을 생성하도록 정의되어 있습니다. 이 아니며 JSON 문자열입니다. 두 번째 및 세 번째 매개 변수없이 JSON.stringify을 사용해야합니다. 그러나 이것도 작동하지 않으므로 Uncaught TypeError: Converting circular structure to JSON 오류가 발생합니다. 이유는 다음과 같습니다. JSON.stringify은 Kotlin 언어의 일부가 아니며 JSON이라는 기본 브라우저 객체의 typed definition입니다. HashMap은 빈 JavaScript 객체가 아니며 모든 유형의 객체를 키로 사용할 수 있으며 자바 객체 인 Map API를 노출합니다.이 객체는 JavaScript 객체에서는 사용할 수 없습니다. 따라서 HashMap은 자신이 수행하는 작업에 적합하지 않습니다. 몇 가지 해결책이 있습니다 :

  1. 우리가 코 틀린 멀티 serilization를 게시 할 때까지 기다릴 수 the corresponding discussion를 참조하십시오. 이 API는 Kotlin 클래스를 이해하고이를 JSON으로 변환 할 수 있습니다.

  2. Kotlin 맵과 목록을 사용하지 말고 json과 같은 순수한 JavaScript 엔티티와 순수 배열을 사용하십시오.

    수입 kotlin.js.json

    fun main(args: Array<String>) { 
        val testData = json(
         "name" to "albert", 
         "age" to 26, 
         "work" to arrayOf("1", "2", "3") 
        ) 
    
        var value = JSON.stringify(testData) 
    
        println(value) 
    } 
    
+0

내 현재 사용법 덕택에 훨씬 좋다, 고마워! 너희들이 풀려날 때까지 기다려라. –

+0

우리는 반복 할 수 있을까? Json 객체의 속성? –

+0

'Object.keys()'또는'Object.getOwnPropertyNames()'를 인라인 JS로 호출하거나이 메소드를 외부로 정의 할 수 있습니다. –