Jump to content

re-codificar JSON após manipulação


Go to solution Solved by HappyHippyHippo,

Recommended Posts

Posted (edited)

Boas malta

Tenho aqui uma dor de cabeça com um código que estou a fazer para transformar o caminho das imagens que estão num ficheiro .json para outro definido. Até aqui tudo bem...

O problema é que, depois de fazer a manipulação disto, e obter os resultados esperados, ao codificar novamente o array para .json o ficheiro é reescrito com absolutamente nada lá dentro. Penso que seja um problema no meu código, mas ainda não consegui dar com o gato. Alguém me consegue ajudar??

function prepareImages($file,$url,$article)
{
$string = file_get_contents($file);
$json = json_decode($string,true);



foreach($json['elements'] as $value)
{
	if($value['type'] == "image")
	{
					$arr = explode('\\', $value['src']);
					$count = count($arr);
					$img = $arr[$count-1];
					$src = $url.'res/'.$article.'/'.$img;
					$value['src'] = $src;
					//print_r($json);
	}
				//This prints all the values correctly
				print_r($value);

}

				// global $value;
				$json = $value;
				$string = json_encode($json);
		file_put_contents($file,$string);

}

Ficheiro .JSON

O ficheiro em si é demasiado extenso, por isso vou apenas postar um "sample" para terem uma ideia.

{
"id": "publication:0",
"settings": {
	"background": "#ffffff",
	"url": "C:/xampp/htdocs/publisher/publication/",
	"title": "publication"
},
"elements": [
	{
		"type": "square",
		"attr": {
			"size": [
				708,
				36
			],
			"background": "e5f5fe"
		}
	},
	{
		"type": "text",
		"content": "Tori Tori Restaurant \nRojkind Arquitectos + ESRAWE Studio\n",
		"attr": {
			"textAlign": "left",
			"fontFamily": "Whitney Semibold",
			"fontSize": 32,
			"lineHeight": 50,
			"color": "333333"
		}
	},
	{
		"type": "image",
		"src": "\\Volumes\\Work\\InProgress\\ArchDaily\\BOTYApp\\_ClientMaterial\\BOTY2011\\ Winners\\Hotels & Restaurants Winner\\Office profile and questionaire\\Hector Esrawe.jpg",
		"caption": "",
		"attr": {
			"selectable": 0
		}
	},
Edited by brunoais
geshi! Mm q seja JSON, o parser do geshi para js serve bem.
Posted

1º - usa o tag code=php no teu post para se poder ler

2º - se tens código comentado que não faz nada, mais vale fazer desaparecer

3º - não forneces o conteúdo do ficheiro (o erro deve estar no parsing $json['elements'])

4º - tenta apresentar o teu código bem indentado

5º - estás a re-declarar a variável $json com o valor da última iteração do ciclo foreach

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

Corrigido... ainda me estou a habituar a este "novo" forum.

Quanto à identação, foi o próprio forum que a fez...

Pois, a variável $json está a ir buscar a ultima iteração... este foi o ultimo teste que fiz

Mas como é que eu consigo fazer isto sem alterar a estrutura do json? Com isto quero dizer, podia meter tudo dentro de um array a cada iteração que saía direito, mas a estrutura do json ia levar com mais um [] no inicio, o que não pode ser feito...

Agradeço toda a ajuda

Edited by fantasma
  • Solution
Posted (edited)

pelo que percebi no teu código o que pretende é somente alterar um parâmetro, para isso é necessário percorrer correctamente os elementos

nota : verifiquei que o json_decode não gosta da sequência de caracteres '\\'

function prepareImages($file,$url,$article) {
 $string = str_replace("\\", "/", file_get_contents($file)); // <-- remove os '\\' alterando por '/'
 $json = json_decode($string,true);
 foreach($json['elements'] as $index => $value) {
if($value['type'] == "image") {
  // para alterar o valor em $jsom é necessário ir directamente ao array
  // a variável $value é uma cópia dos dados
  // tens também a maneira mais directa de ir ler o ultimo elemento do url
  $json['elements'][$index]['src'] = $url.'res/'.$article.'/'.end(explode("/", $value['src']));
}
 }
 file_put_contents($file,json_encode($json));;
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

Dá-me este erro

Warning: Invalid argument supplied for foreach() in ....

Estranho porque o loop parece-me correcto 😕

EDIT: Já percebi o porquê do erro

O caminho das imagens no .json aparece como \\caminho\\para\\imagem, e o str_replace so estava a substituir \, o que depois no decode, não fazia a variavel assumir-se como array (o que originava o erro).

Substitui a linha

$string = str_replace("\\", "/", file_get_contents($file)); // <-- remove os '\\' alterando por '/'

por

$string = str_replace("\\\\", "/", file_get_contents($file)); // <-- remove os '\\' alterando por '/'

E já funciona na perfeição.

Obrigado HappyHippyHippo

Edited by fantasma

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.