[SPRING] JsonIdentityInfo가 포함 된 JavaScript에서 Jackson 객체를 deserialize합니다.
SPRINGJsonIdentityInfo가 포함 된 JavaScript에서 Jackson 객체를 deserialize합니다.
안녕하세요 (제 영어는 유감입니다)
저는 angularjs 프론트 엔드 웹 사이트에서 SPRING MVC로 json을 생성하는 웹 서비스를 사용하고 있습니다. 스프링 mvc는 JsonIdentityInfo 옵션을 사용하여 각 객체가 json에서 한 번만 실행되고 참조가 사용될 때마다 동일한 객체 "구성 요소"를 사용하는 2 개의 "컴퓨터"가 있으므로 예를 들어 봄에 ID를 넣습니다. 첫 번째 구성 요소 ( "@componentID": 2)와 두 번째 구성 요소의 경우 id (2) :
[
{
"@computerID": 1,
"component": {
"@componentID": 2,
"processor": 2,
"ram": "8g",
"harddrive": "wd"
}
},
{
"@computerID": 3,
"component": 2
}
]
내가 원하는 것 :
[
{
"@computerID": 1,
"owner" : "Mister B",
"component": {
"@componentID": 2,
"processor": 2,
"ram": "8g",
"harddrive": "wd"
}
},
{
"@computerID": 3,
"owner" : "Mister A",
"component": {
"@componentID": 2,
"processor": 2,
"ram": "8g",
"harddrive": "wd"
}
}
]
나는 이것을하는 많은 코드를 찾았지만 아무 것도 찾지 못했습니다.
이 동작을 제거하기 위해 웹 서비스를 편집 할 수 없습니다. 내가 자바 스크립트 또는 jquery (또는 다른 librairie) 진짜 참조 된 개체와 참조를 대체 클라이언트 쪽에서 json을 편집 할 수 있습니까? (데이터가 사실 더 복잡하고 깊어, 나는 하위 개체의 3 단계 개체에있다).
고마워.
해결법
-
==============================
1.모든 배열 구성원을 새로운 배열로 나눕니다. 전체 요소 속성 (숫자가 아님)과없는 요소입니다. 숫자 구성 요소 속성을 가져야하는 나머지 원본 멤버를 반복 한 다음 "양호한"배열에서 해당 @componentID를 찾아 복사하고 이동하십시오.
모든 배열 구성원을 새로운 배열로 나눕니다. 전체 요소 속성 (숫자가 아님)과없는 요소입니다. 숫자 구성 요소 속성을 가져야하는 나머지 원본 멤버를 반복 한 다음 "양호한"배열에서 해당 @componentID를 찾아 복사하고 이동하십시오.
// initialize some vars var final = [], temp = [], bad = [], c = {}, computers = [ { "@computerID": 1, "component": { "@componentID": 2, "processor": 2, "ram": "8g", "harddrive": "wd" } }, { "@computerID": 3, "component": 2 } ]; // split original array into 3: final, bad, & temp while(computers.length > 0) { c = computers.pop(); if (c.hasOwnProperty("component")) { if (typeof c.component === "number") { temp.push(c); } else { final.push(c); } } else { bad.push(c); } } // loop through temp & look up @componentID within final while (temp.length > 0) { c = temp.pop(); // should @componentID be 1-of-a-kind? var found = getObjects(final, "@componentID", c.component); if (found.length) { c.component = found[0]; final.push(c); } else { bad.push(c); } } // SOURCE: http://stackoverflow.com/a/4992429/1072176 function getObjects(obj, key, val) { var objects = []; for (var i in obj) { if (!obj.hasOwnProperty(i)) continue; if (typeof obj[i] == 'object') { objects = objects.concat(getObjects(obj[i], key, val)); } else if (i == key && obj[key] == val) { objects.push(obj); } } return objects; } // should result in just one or two populated arrays: final and/or bad alert(JSON.stringify(final));
당신은 실제로 세 개의 배열을 만들었지 만, 두 개만 채워진다는 사실을 알게 될 것입니다 : final은 좋은 새로운 객체를 가지며, 다른 하나는 (나쁜) 컴포넌트 속성이없는 객체의 catch-all이거나 해당 컴포넌트 번호에 해당하는 객체입니다. @componentID를 찾을 수 없습니다.
-
==============================
2.나는 최근에 OP가 여기서 묘사 한 정확한 시나리오를 보았습니다. 아래는 나의 해결책이었다. 이를 해결하기 위해 JSOG (Javascript Object Graph) 형식을 사용하십시오.
나는 최근에 OP가 여기서 묘사 한 정확한 시나리오를 보았습니다. 아래는 나의 해결책이었다. 이를 해결하기 위해 JSOG (Javascript Object Graph) 형식을 사용하십시오.
서버 측 Jackson-Jsog 플러그인 https://github.com/jsog/jsog-jackson을 사용하십시오. 아래 주석을 사용하여 각 클래스에 주석을 작성하십시오.
@JsonIdentityInfo (생성자 = JSOGGenerator.class)
대신에
@JsonIdentityInfo (생성기 = ObjectIdGenerators.IntSequenceGenerator.class, 속성 = "@id")
이것은 JSOG 형식으로 생성됩니다. (@id 및 @ref)
클라이언트 측에서 jsog.js를 사용하십시오.
아래의 호출을 사용하여 JSOG 구조를 순환 구조로 변환한다.
cyclicGraph = JSOG.decode (jsogStructure);
from https://stackoverflow.com/questions/24208167/deserialize-jackson-object-in-javascript-containing-jsonidentityinfo by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 최대 절전 모드, 봄, JPA 및 격리 - 사용자 정의 격리는 지원되지 않습니다. (0) | 2018.12.19 |
---|---|
[SPRING] Spring / Rest @PathVariable 문자 인코딩 (0) | 2018.12.19 |
[SPRING] @ static 클래스에서의 autowired (0) | 2018.12.19 |
[SPRING] 스프링 부트 - jar 파일 만들기 - META-INF / spring.factories에 자동 구성 클래스가 없습니다. (0) | 2018.12.19 |
[SPRING] 유형별로 참조 빈을 Autowire로 나열 (0) | 2018.12.19 |