2016-09-24 5 views
2

Я новичок в React Native и хочу получить вложенный объект из json. Вот мой код. И я могу получить succesfuly data.phone но всегда получаю это, если я пытаюсь получить data.name.title или т.п.Как получить json-вложенный объект?

неопределенный не является объект

Вот мой код.

class Dictionary extends Component { 
    // Initialize the hardcoded data 
    constructor(props) { 
     super(props); 

     const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 
     this.state = { 
      dataSource: ds.cloneWithRows([ 
       'John', 'Joel', 'James', 'Jimmy', 'Jackson', 'Jillian', 'Julie', 'Devin' 
      ]) 
     }; 

     fetch('http://api.randomuser.me/?results=50') 
      .then((response) => response.json()) 
      .then((responseJson) => { 
       //return responseJson.movies; 
       console.log(responseJson.results); 
       this.setState({ 
        dataSource: ds.cloneWithRows(responseJson.results), 
        loaded:false, 
       }) 

      }) 
      .catch((error) => { 
       console.error(error); 
      }); 
    } 

    render() { 
     return (
      <View 
       style={styles.container}> 

       <ListView 
        dataSource={this.state.dataSource} 
        renderRow={(data) => 
         <View> 
          <Text> 
           {data.phone} 
          </Text> 
           <Text> 
      {data.name.title} 
     </Text> 
         </View> 
        } 
        renderSeparator={(sectionId, rowId) => <View key={rowId} style={styles.separator} />} 
       /> 
      </View> 
     ); 
    } 
} 

Как я могу получить название.title? Благодаря А вот и JSON данные randomuser.me

{"results":[{"gender":"female","name":{"title":"miss","first":"abby","last":"perkins"},"location":{"street":"9542 highfield road","city":"ely","state":"herefordshire","postcode":"J9 2ZJ"},"email":"[email protected]","login":{"username":"redcat541","password":"1026","salt":"LIsOByBg","md5":"2890bf50a87289f7f3664840e2c47fe3","sha1":"1944896ba6cc78ad32dcf927dc5c9226d2f9e050","sha256":"9013be19c91195788009cc545f8a2be4494687dc29b155513022ce9157b73785"},"dob":"1959-05-20 07:03:41","registered":"2006-07-10 01:28:56","phone":"0101 716 4694","cell":"0738-649-138","id":{"name":"NINO","value":"BC 35 80 42 Q"},"picture":{"large":"https://randomuser.me/api/portraits/women/54.jpg","medium":"https://randomuser.me/api/portraits/med/women/54.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/54.jpg"},"nat":"GB"}],"info":{"seed":"2e632bbc13c85cb2","results":1,"page":1,"version":"1.1"}} 

когда я console.log (data.name) Я получаю { "название": "мисс", "первый": "Abby", «last»: «perkins»} и т. д. на каждой итерации я получаю разные имена. Поэтому я думаю, что нет необходимости в данных [0] - похоже, что все нормально с получением соответствующего объекта данных. просто нужно получить доступ к data.name.title, но не повезло с ним. Извините, это довольно запутанно для меня на этот раз, так как каждый предыдущий момент не возникало проблем с любым json obj или массивом

ответ

2

Это вызывается конструктором, но я не знаю, почему.

Просто передайте пустой массив, и он будет работать.

this.state = { 
    dataSource: ds.cloneWithRows([]) 
}; 

Вы можете сделать это тоже:

this.state = { 
    dataSource: ds.cloneWithRows([{name: "Ahmed"}]) 
}; 

Смотрите здесь для получения дополнительной информации: https://facebook.github.io/react-native/docs/listviewdatasource.html#clonewithrows

+0

ничего себе! Большое спасибо! – SERG

+0

@SERG Рад помочь. –

1

Его потому, что ваш {data.name.title} находится прямо в поле зрения. Поместите что в <Text> компонента, как это:

<ListView 
    dataSource={this.state.dataSource} 
    renderRow={(data) => 
     <View> 
      <Text> 
       {data.phone} 
      </Text> 
      <Text> 
       {data.name.title} 
      </Text> 
     </View> 
    } 
    renderSeparator={(sectionId, rowId) => <View key={rowId} style={styles.separator} />} 
/> 
+0

Спасибо, теперь я получаю «неопределенные не является объектом» – SERG

+1

Это просто разбор JSON , и Реакт ничем не отличается. Возможно, в вашем json, console.log (данные) нет имени внутри вашего renderRow и посмотреть, что у вас есть. – abeikverdi

+0

в этом примере https://medium.com/differential/react-native-basics-how-to-use-the-listview-component-a0ec44cf1fe8, они просто используют props.name.last - и это работает, поэтому это не «no name», но для меня это не работает по некоторым причинам. – SERG

-1

Не могли бы вы попробовать это? с момента json хранится в data затем name.title может получить от data.result[0].name.title

+0

все еще получает «underfined is not a object», и я передаю данные с этим this.setState ({ dataSource: ds.cloneWithRows (responseJson.результаты), }), поэтому не должно быть никаких «результатов», как я понимаю – SERG

Смежные вопросы