2016-11-28 2 views
1

Я пытаюсь получить список книг, которые я анализирую из XML, и мне хотелось бы, чтобы результат был как JSON.Проблемы с построением JSON из XML с помощью SimpleXML

Я хотел бы формат JSON быть:

[ 
    "1" : { 
     "Title": "Sidemen: The Book", 
     "ISBN": "1473648165", 
     "Rating": "4.5" 
    }, 
    ... 
] 

Однако результат выходит так:

[ 
    { 
    "title":{ 
     "0":"Sidemen: The Book" 
    }, 
    "ISBN":{ 
     "0":"1473648165" 
    } 
    }, 
    { 
    "title":{ 
     "0":"DanTDM: Trayaurus and the Enchanted Crystal" 
    }, 
    "ISBN":{ 
     "0":"1409168395" 
    } 
    }, 
    { 
    "title":{ 
     "0":"Pok\u00e9mon Sun & Pok\u00e9mon Moon: The Official Strategy Guide" 
    }, 
    "ISBN":{ 
     "0":"1911015109" 
    } 
    }, 
    { 
    "title":{ 
     "0":"Guinness World Records 2017 Gamer's Edition" 
    }, 
    "ISBN":{ 
     "0":"1910561398" 
    } 
    }, 
    { 
    "title":{ 
     "0":"Minecraft: Blockopedia: An Official Minecraft Book from Mojang" 
    }, 
    "ISBN":{ 
     "0":"1405273534" 
    } 
    }, 
    { 
    "title":{ 
     "0":"Final Fantasy XV - The Complete Official Guide - Collector's Edition" 
    }, 
    "ISBN":{ 
     "0":"1911015001" 
    } 
    }, 
    { 
    "title":{ 
     "0":"Harry Potter: Collectible Quidditch Set" 
    }, 
    "ISBN":{ 
     "0":"076245945X" 
    } 
    }, 
    { 
    "title":{ 
     "0":"Pok\u00e9mon Go The Unofficial Field Guide: Tips, tricks and hacks that will help you catch them all!" 
    }, 
    "ISBN":{ 
     "0":"1783707712" 
    } 
    }, 
    { 
    "title":{ 
     "0":"Minecraft 2017 Annual (by GamesMaster) (2017 Annuals)" 
    }, 
    "ISBN":{ 
     "0":"0995495025" 
    } 
    }, 
    { 
    "title":{ 
     "0":"World of Warcraft The Official Cookbook" 
    }, 
    "ISBN":{ 
     "0":"1785654349" 
    } 
    } 
] 

Я не могу показаться, чтобы выяснить, почему это не делать то, что я хочу (проблемы, потому что я нооб). Это генерируется с помощью PHP так:

$bookList = array(); 
$id = 0; 
foreach ($parsed_xml->Items->Item as $item) { 
    $response = file_get_contents($GoodReadsProductLink); 
    $parsed_xml = simplexml_load_string($response); 

    $currentBook = array(
    "title" => $item->ItemAttributes->Title, 
    "ISBN" => $item->ItemAttributes->ISBN, 
    "Rating" => $item->ItemAttributes->Rating 
); 

    $bookList[$id] = $currentBook; 

    $id++; 
} 

$jsonOutput = json_encode($bookList); 


var_dump($jsonOutput); 

Может ли кто-нибудь увидеть проблему и помочь мне правильно отформатировать выход JSON?

+2

Вы желаете формат не является действительным JSON ... Вы можете сказать нам, что случилось с тем, что вы сейчас получаете? –

+1

Кроме того, вы, вероятно, хотите, чтобы эти элементы simplexml были перенесены в строки. Например. '" title "=> (string) $ item-> ItemAttributes-> Title'. Другое также, это не похоже на то, что «Рейтинг» фактически существует? –

+0

@ john-stirling Является ли это недействительным JSON? это результат, который я делаю правильно? Я хочу, чтобы каждая книга была связана с идентификатором – JamesG

ответ

1

CastSimpleXmlElement объектов to string и использовать опцию JSON_FORCE_OBJECT.

Пример.

$xml = <<<'XML' 
<Items> 
    <Item Title="Book Title 1" ISBN="ISBN 1" Rating="4.5"/> 
    <Item Title="Book Title 2" ISBN="ISBN 2" Rating="5.0"/> 
</Items> 
XML; 
$doc = simplexml_load_string($xml); 

$id = 0; 
$books = []; 
foreach ($doc as $item) { 
    if (! $attr = $item->attributes()) { 
    continue; 
    } 

    if (empty($attr['Title']) || empty($attr['ISBN']) || empty($attr['Rating'])) { 
    continue; 
    } 

    $books[++$id] = [ 
    'title' => (string)$attr['Title'], 
    'ISBN' => (string)$attr['ISBN'], 
    'Rating' => (string)$attr['Rating'], 
    ]; 
} 

echo $json = json_encode($books, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT); 

Выход

{ 
    "1": { 
     "title": "Book Title 1", 
     "ISBN": "ISBN 1", 
     "Rating": "4.5" 
    }, 
    "2": { 
     "title": "Book Title 2", 
     "ISBN": "ISBN 2", 
     "Rating": "5.0" 
    } 
} 
+0

, который работает с несколькими настройками. Однако, если заголовок содержит '/', он добавляет вывод как: '\/\ /'. Я пробовал str_replace ("\ /", "/", $ title), но он ничего не делает, никаких идей? – JamesG

+0

@JamesG, добавьте параметр JSON_UNESCAPED_SLASHES –

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