2016-12-31 5 views
0

javscript에서 가정용 자동화 시스템의 JSON 응답을 구문 분석하려고합니다. 응답은 응답의 작은 부분 available here주문 변경을 계속하는 JSON 응답의 값을 구문 분석

이며, 또한, 내가, 스와는 숫자 인덱스를 사용하여 알 수없는 이유로 재부팅 할 때마다 키 변경의 순서 못해 정말 내가 필요 작업 sensor.out, sensor.in, sensor.door의 상태 값을 andorid의 작업자를위한 변수에 저장할 수 있어야합니다. entity.id를 사용하여 선택하려했지만 어떤 이유로 코드가 완료되지 않았습니다. 내가 무엇을하고 있었는지 안다)

+1

가 빠른 노트에 질문 –

+0

에 코드를 추가, 당신은 배열을 통해 루프해야하고, 확인 'entity_id'. 일치하는 경우 '상태'를 기록하십시오. – 31piy

답변

1

ES6 사용하면 Array#find 방법을 사용할 수 있습니다

response.find(o => o.entity_id == 'sensor.out').state 

참조를 조각 : 또는

var response = [ { "attributes":{ "friendly_name":"door" }, "entity_id":"sensor.door", "last_changed":"2016-12-31T11:15:59.395808+00:00", "last_updated":"2016-12-31T11:15:59.395808+00:00", "state":"closed" }, { "attributes":{ "friendly_name":"In", "unit_of_measurement":"\u00b0C" }, "entity_id":"sensor.in", "last_changed":"2016-12-31T11:20:02.179821+00:00", "last_updated":"2016-12-31T11:20:02.179821+00:00", "state":"20.7" }, { "attributes":{ "changed_by":null, "code_format":".+", "friendly_name":"panel" }, "entity_id":"alarm_control_panel.panel", "last_changed":"2016-12-31T11:14:56.471966+00:00", "last_updated":"2016-12-31T11:14:56.471966+00:00", "state":"disarmed" }, { "attributes":{ "friendly_name":"Out", "unit_of_measurement":"\u00b0C" }, "entity_id":"sensor.out", "last_changed":"2016-12-31T11:14:58.452345+00:00", "last_updated":"2016-12-31T11:14:58.452345+00:00", "state":"7.1" }]; 
 
var state = response.find(o => o.entity_id == 'sensor.out').state; 
 
console.log('sensor.out state is', state);

는, 당신이 개체에 대한 응답을 변환 할 수 있습니다 엔터티 ID 값을 키로 사용하여 response['session.out'].state 같은 CCESS을 :

response = Object.assign({}, ...response.map(o => ({[o.entity_id]: o}))); 

페이지 미리보기 :

var response = [ { "attributes":{ "friendly_name":"door" }, "entity_id":"sensor.door", "last_changed":"2016-12-31T11:15:59.395808+00:00", "last_updated":"2016-12-31T11:15:59.395808+00:00", "state":"closed" }, { "attributes":{ "friendly_name":"In", "unit_of_measurement":"\u00b0C" }, "entity_id":"sensor.in", "last_changed":"2016-12-31T11:20:02.179821+00:00", "last_updated":"2016-12-31T11:20:02.179821+00:00", "state":"20.7" }, { "attributes":{ "changed_by":null, "code_format":".+", "friendly_name":"panel" }, "entity_id":"alarm_control_panel.panel", "last_changed":"2016-12-31T11:14:56.471966+00:00", "last_updated":"2016-12-31T11:14:56.471966+00:00", "state":"disarmed" }, { "attributes":{ "friendly_name":"Out", "unit_of_measurement":"\u00b0C" }, "entity_id":"sensor.out", "last_changed":"2016-12-31T11:14:58.452345+00:00", "last_updated":"2016-12-31T11:14:58.452345+00:00", "state":"7.1" }]; 
 
response = Object.assign({}, ...response.map(o => ({[o.entity_id]: o}))); 
 
console.log('sensor.out state is', response['sensor.out'].state);

0

개체에서 속성을 선택하기 위해 색인을 사용하려는 경우 매우 특별한 이유가없는 한 그렇게해서는 안됩니다.

다행히도 괜찮습니다. 주문을 알 필요가 없습니다. JSON 배열에서 두 개의 객체를 가져 와서 속성을 뒤섞어서 지정한 key/val을 포함하는 객체를 반환하는 함수를 작성했습니다.

귀하의 질문에 따라하기가 조금 어렵지만, 저는 이것이 당신에게 아이디어를 줄 것이라고 생각합니다.

<script type="text/javascript"> 
let arr = [ 
    { 
    "attributes":{ 
     "friendly_name":"door" 
    }, 
    "entity_id":"sensor.frontdoor", 
    "last_changed":"2016-12-31T11:15:59.395808+00:00", 
    "last_updated":"2016-12-31T11:15:59.395808+00:00", 
    "state":"closed" 
    }, 
    { 
    "last_changed":"2016-12-31T11:15:59.395808+00:00", 
    "state":"closed", 
    "attributes":{ 
     "friendly_name":"door" 
    }, 
    "entity_id":"sensor.backdoor", 
    "last_updated":"2016-12-31T11:15:59.395808+00:00" 
    } 
]; 

function findKey (theKey, theVal) { 
    let reduced = arr.filter (d => { 
    return d [ theKey ] === theVal; 
    }); 

    return reduced; 
} 

let targets = findKey ('entity_id', 'sensor.backdoor'); 
targets.forEach (d => { 
    // This check is a little naive, but should give you the idea 
    if ('state' in d) { 
     console.log (d.state); 
    } 
}); 
</script> 
+0

특정 entity_id의 상태 값을 얻으려면 어떻게 사용해야합니까? –

+0

흠, entity_id가 포함 된 obj의 "상태"값을 원하면 다음과 같이 말합니다. sensor.backdoor? –

+0

바로 그거야! 죄송합니다 그게 적절하게 진술하지 않았다면 –

0

모든 사람들이 옳다고 말한 것 : 응답의 키 순서는 중요하지 않습니다. 숫자 인덱스가 아닌 (문자열) 키를 사용하십시오.

var arr = [ 
    { 
    "entity_id":"sensor.door", 
    "state":"closed" 
    }]; // other attributes chopped out for brevity 

var entity_id_interested_in = 'sensor.door'; 
var state = '[entity_id not found in response]'; 
for (var i = 0; i < arr.length; i++) { 

    console.log(arr[i].entity_id + ' state:' + arr[i].state); 
    if (arr[i].entity_id == entity_id_interested_in) 
    { 
     state = arr[i].state; 
     break; 
    } 
} 
console.log (state);