#reactjs #json
Вопрос:
Я получаю ответ rest API от URL-адреса API. Но мне нужно расшифровать некоторые части ответа от JSON на объект.Вот ответ.
Здесь вы можете видеть price
, и service_timespan
эти две вещи должны быть в JSON.parse(). Так что эти значения можно использовать.С другой стороны, я не могу их использовать.
вот мой код
{ services.length > 0 amp;amp; services.map(( service, index ) => (
<tr key={service.id} className={index % 2 === 0 ? 'bg-white' : 'bg-gray-50'}>
<td className="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">{service.service_name}</td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{service.service_cat_id}</td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{service.price.base_price.amount}</td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{service.service_timespan.duration.length}</td>
<td className="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<a href="#" className="text-indigo-600 hover:text-indigo-900">
Edit
</a>
</td>
</tr>
))
}
Вот я и добираюсь cannot read property amount of undefined
Комментарии:
1. Вы, кажется, знаете о
JSON.parse
том, чтобы анализировать JSON, так что же вам мешает это сделать?2. Я думаю, что вас сбивает с толку то, что вы получаете строку JSON, которая включает поля, значения которых также являются строками json. Таким образом, после анализа внешнего объекта эти значения по-прежнему являются строками, которые необходимо
JSON.parse
обрабатывать отдельно.3. @rayhatfield Точно, вы правы. Когда я использую функцию map, мне также нужно JSON.также проанализировать эти строки json. Но я не могу этого понять
Ответ №1:
{ (services || []).map(s => {
...s,
price: JSON.parse(s.price),
service_timestamp: JSON.encode(s.service_timestamp)
})
.map(( service, index ) => ( your component) }
Но если вы можете, избегайте помещать это в свой компонент, так как это будет оцениваться при каждом рендеринге. Выполните синтаксический анализ в службе Api, если у вас есть, когда вы получите ответ или в useMemo