2011-04-26 3 views
0

내가 만드는 웹 사이트의 경우 서버에서 JSON 문자열로 제공된 데이터를 기반으로 견적을 만들어야합니다. 나는이 사이트 (및 기타 여러 사이트)를 살펴 보았지만 데이터를 쿼리/검색하는 최선의 방법은 아직 확실하지 않습니다.JSON 내에서 값 쿼리/검색

예를 들어, Area ID에서 Area Name을 가져와야합니다. 나는 지역의 최대 나이와 주어진 최소/최대 나이의 가격을 받아야합니다.

가격 배열을 원합니다.

eval 메서드를 사용하여 문자열에서 Javascript 객체를 만드는 것이 가장 좋습니까? 아니면 jQuery를 사용해야합니까?

도움 주셔서 감사합니다.

({"SkiPass":[{"Id":1,"Area":"Chamonix","Rates":[{"Id":1,"AgeMin":0,"AgeMax":2,"Price":2.5},{"Id":2,"AgeMin":3,"AgeMax":17,"Price":5.0},{"Id":3,"AgeMin":18,"AgeMax":30,"Price":6.2},{"Id":4,"AgeMin":31,"AgeMax":59,"Price":7.4}]}, 

{"Id":2,"Area":"Megeve","Rates":[{"Id":1,"AgeMin":0,"AgeMax":2,"Price":1},{"Id":2,"AgeMin":3,"AgeMax":17,"Price":2.0},{"Id":3,"AgeMin":18,"AgeMax":30,"Price":2.2},{"Id":4,"AgeMin":31,"AgeMax":59,"Price":4.4}]}, 

{"Id":3,"Area":"Verbier","Rates":[{"Id":1,"AgeMin":0,"AgeMax":2,"Price":1.5},{"Id":2,"AgeMin":3,"AgeMax":17,"Price":3.0},{"Id":3,"AgeMin":18,"AgeMax":30,"Price":4.2},{"Id":4,"AgeMin":31,"AgeMax":59,"Price":5.4}]}]}) 
+0

이 울립니다. 데이터를 XML로 얻을 수있는 기회가 있습니까? – Dan

+0

@ Dan - 내 답글을 참조하십시오. 이 JS 라이브러리를 사용하면 이제 XPath –

답변

1

문자열에서 JavaScript 개체를 생성하는 것이 가장 확실하지만 "eval()"이 아닌 합법적 인 JSON 구문 분석 기능으로 수행하십시오. 은 jQuery를 사용할 수 있지만 작고 간단한 json.org에서 사용할 수있는 JSON 도구와 같은 다른 솔루션이 있습니다.

일단 JavaScript 개체라면, 어떤 쿼리 솔루션이 필요한지 여부를 안내해야합니다. 또는 프로그래밍 단순한 문제 일 것입니다.

1

내가 가장 좋은 방법은 jLinq :라고 생각합니다. JSON에서 SQL 쿼리를 수행하는 것과 같습니다. jQuery가 필요하지 않습니다. 나는 그것을 사용하고, 그것은 훌륭합니다.

+0

을 사용하여 JSON 구조를 쿼리 할 수 ​​있습니다. for 문을 사용하여 객체를 반복 할 때 필요한 정보를 찾을 수있을 것 같습니다. 이것은 jLinq와 같은 것을 사용하는 것보다 훨씬 더 빠르거나 느릴까요? – FloatLeft

0

이미 jQuery를 사용하고 있거나 JSON으로 서버 측에서 전달하는 경우 JSON.parse() 또는 jQuery.parseJSON()을 사용하여 JSON 문자열에서 객체를 만듭니다.

그런 다음 개체를 반복하여 원하는 레코드를 찾을 수 있습니다. 또는 개체를 만들어 자연스럽게 데이터를 가져올 수 있습니다.

+0

페이지에서 jQuery를 이미 많이 사용하고 있으므로 이해하기 쉽습니다. 그러나 다음은 작동하지 않는 것 같습니다 : var skiPasses = jQuery.parseJSON ({ "스키 패스": [{ "이드": "지역": "샤모니", "요금": [{ "이드" 1, "AgeMin": 0, "AgeMax": 2, "Price": 2.5}, { "Id": 2, "AgeMin": 3, "AgeMax": 17, "Price": 5.0} ": 3,"AgeMin ": 18,"AgeMax ": 30,"Price ": 6.2,}, 4, "AgeMin": 31, "AgeMax": 59, "Price": 7.4}]}, { "Id": 3, "Area": ​​"Verbier" [{ "Id": 1, "AgeMin": 0, "AgeMax": 2, "Price": 1.5}, { "Id": 2, "AgeMin": 3, "AgeMax": 17, "Price" 3.0, { "Id": 3, "AgeMin": 18, "AgeMax": 30, "Price": 4.2}, { "Id": 4, "AgeMin": 31, "AgeMax": 59, ": 5.4}]}}}) – FloatLeft

+1

개체와 함께 호출하기 때문에. 따라서 parseJSON ("name ':'Aviv '})은 ​​작동하지 않습니다. 따라서 parseJSON ("{'name ':'Aviv '} ")이 작동하지만 문자열로 호출해야합니다. – aviv

0

FloatLeft - Dan이 지적했듯이 XPath를 사용할 수 있으면 XML 형식으로 데이터를 다시 작성할 필요가 없으므로 작업이 훨씬 쉬울 것입니다. DefiantJS (http://defiantjs.com)를 사용하면 은 이제 XPath 표현식을 사용하여 JSON 구조를 쿼리합니다.

DefiantJS는 XPath 쿼리를 활성화하고 일치하는 배열 (일치하는 항목이없는 경우 빈 배열)을 반환하는 "search"메서드를 사용하여 전역 개체 JSON을 확장합니다. 반환 된 배열에는 집계 함수도 있습니다. 이 중 하나 "sortDesc".

이 작동하는 피들을 확인하십시오. 당신이 JSON에 대한 XPath에 상응 원하는처럼
http://jsfiddle.net/hbi99/H3PR3/

var data = { 
    "SkiPass": [ 
     ... 
     { 
     "Id": 3, 
     "Area": "Verbier", 
     "Rates": [ 
      { "Id": 1, "AgeMin": 0, "AgeMax": 2, "Price": 1.5 }, 
      { "Id": 2, "AgeMin": 3, "AgeMax": 17, "Price": 3 }, 
      { "Id": 3, "AgeMin": 18, "AgeMax": 30, "Price": 4.2 }, 
      { "Id": 4, "AgeMin": 31, "AgeMax": 59, "Price": 5.4 } 
     ] 
    } 
    ] 
}, 
res1 = JSON.search(data, '//SkiPass[Id=3]/Area'), 
res2 = JSON.search(data, '//*[Area and Id=3]/Rates') 
      .sortDesc('AgeMax'); // <-- sorting descending by the value of "AgeMax" 

document.getElementById('name').innerHTML = res1; 

document.getElementById('max_age').innerHTML = res2[0].AgeMax; 
document.getElementById('price').innerHTML = res2[0].Price; 
관련 문제