2015-01-12 3 views
1

저는 RESTful 웹 서비스를 만들고 있습니다. JSON 파일에 게시 된 항목에 ID가 있어야합니다. 나는 도처에서 찾고 있었지만 이것을하는 방법을 찾을 수 없었다. 이 파일이자동 증분 ID JSON

[ 
    { 
     "id": "2", 
     "title": "Hello World", 
     "artist": "John Smith", 
     "genre": "pop", 
     "week": "4", 
     "highest_rating": "3", 
     "year": "2014", 
     "youtube": "www", 
     "links": [ 
      { 
       "rel": "self", 
       "href": "" 
      }, 
      { 
       "rel": "collection", 
       "href": "" 
      } 
     ] 
    }, 
    { 
     "id": "3", 
     "title": "Lorem Ipsum", 
     "artist": "John Smith", 
     "genre": "pop", 
     "week": "4", 
     "highest_rating": "3", 
     "year": "2014", 
     "youtube": "www", 
     "links": [ 
      { 
       "rel": "self", 
       "href": "" 
      }, 
      { 
       "rel": "collection", 
       "href": "" 
      } 
     ] 
    } 
] 

는 ID의 하드 코드처럼

는 JSON 보인다. 는 사람이 어떻게 내가 뭘 원하는지 설명에 불분명 한 참조 자동 증가

편집 와 아이디의를 얻을 수 말해 주시겠습니까.

웹 서비스에 게시되는 데이터는 .json 파일에 저장됩니다. 나는 DB를 사용하지 않는다. PHP에서는 이것이 내가하는 일입니다.

$file = file_get_contents("data.json"); 
    $data = json_decode($file, true); 


    $data[] = array(
     'id'=>$_POST["id"], 
     'title'=>$_POST["title"], 
     'artist'=>$_POST["artist"], 
     'genre'=>$_POST["genre"], 
     'week'=>$_POST["week"], 
     'highest_rating'=>$_POST["highest_rating"], 
     'year'=>$_POST["year"], 
     'youtube'=>$_POST["youtube"], 
     "links"=> [ array(
       "rel"=>"self", 
       "href"=>"" 
      ), 
      array(
       "rel"=>"collection", 
       "href"=>"" 
      ) 
     ] 
    ); 

    file_put_contents('data.json',json_encode($data)); 

따라서 ID는 POST를 통해 제공되지만 자동 증가로 부여해야합니다. 이것이 내 질문을 명확하게하기를 바랍니다.

답변

2

응용 프로그램에 따라 다릅니다. DB를 사용한다면 DB 기본 키 값을 사용해야하지만, 간단한 .json 파일에 정보를 저장하려면 각 행 ID를 직접 선언해야합니다. 마지막 것을 얻고 그것을 증가 시키십시오.

이 데이터는 파일이 아닌 DB에 저장하는 것이 좋습니다. 트랜잭션에 문제가 생기지 않습니다 (파일 동시 쓰기).

업데이트

확인, 코드에 따라 : 우리는 acquire an exclusive lock on the file while proceeding to the writing에 이상 LOCK_EX 플래그를 사용하고

$file = file_get_contents("data.json"); 
$data = json_decode($file, true); 

// Get last id 
$last_item = end($data); 
$last_item_id = $last_item['id']; 

$data[] = array(
    'id'    => ++$last_item_id, 
    'title'   => $_POST["title"], 
    'artist'   => $_POST["artist"], 
    'genre'   => $_POST["genre"], 
    'week'   => $_POST["week"], 
    'highest_rating' => $_POST["highest_rating"], 
    'year'   => $_POST["year"], 
    'youtube'  => $_POST["youtube"], 
    "links"   => [ 
     array(
      "rel"=>"self", 
      "href"=>"" 
     ), 
     array(
      "rel"=>"collection", 
      "href"=>"" 
     ) 
    ] 
); 

file_put_contents('data.json',json_encode($data), LOCK_EX); 

. 내가 JSON과 같은 문제가 있었다,하지만 내 경우는 MySQL의에서 JSON을의

$filename = "data.json"; 
$filesize = filesize($filename); 
$fp  = fopen($filename, "r+"); 

if (flock($fp, LOCK_EX)) 
{ 
    $data = json_decode(fread($fp, $filesize), true); 

    // Get last id 
    $last_item = end($data); 
    $last_item_id = $last_item['id']; 

    $data[] = array(
     'id'    => ++$last_item_id, 
     'title'   => 1, 
     'artist'   => 2, 
     'genre'   => 3, 
     'week'   => 4, 
     'highest_rating' => 5, 
     'year'   => 6, 
     'youtube'  => 7, 
     "links"   => [ 
      array(
       "rel" => "self", 
       "href" => "" 
      ), 
      array(
       "rel" => "collection", 
       "href" => "" 
      ) 
     ] 
    ); 

    fseek($fp, 0); 
    ftruncate($fp, 0); 

    fwrite($fp, json_encode($data)); 

    flock($fp, LOCK_UN); 
} 
else 
{ 
    echo "Unable to lock file"; 
} 

fclose($fp); 
+0

. 도와 주셔서 정말 감사합니다! – user3182261

+0

마지막 질문 하나. 나는 지금 경고를 얻고있다. end()는 매개 변수 1이 배열이 될 것으로 기대한다. $ last_item = end ($ data); 그 이유는 무엇입니까? – user3182261

+0

fread()가 파일 내용을 반환하지 않았을 수 있습니까? –

0

자동 증가를 원하는 것이 분명하지 않지만 서버가 게시물을 가져 오면 결과를 반복하고 필요한 ID를 추가 할 수 있습니다.

결국 사용자가 전달한 모든 데이터에 대해 사용자가 시스템의 내부 ID를 제공 할 것이라고 기대할 수 없습니다.

자동 증가 ID가있는 경우 mysql에서 id 제공을 기대하지 않는 것과 같은 방식입니다.

내 제안 : 들어오는 json을 반복하고 db에서 자신의 ID를 적용하거나 그렇지 않습니다.

0

: 당신이 DB를 사용할 수없는 경우

나는 그것을 읽고 flock() 기능으로 파일을 작성하는 것이 더 안전하다고 생각 고유 한 ID로 일부 데이터를 저장합니다.

첫 번째 예제가 작동하지만 값을 제거해야 할 경우 다음 번에 값을 추가하면 중복 ID가 발생하므로 올바르게 작동하지 않습니다.

값을 제거/추가해야하며 항상 고유 ID가 있어야하는 경우 간단하게 찾을 수 있습니다.

첫째, 모든 ID를의 array_column 기능을하고있다 얻으려면 올바른 방법이

$idsList = array_column($data, 'id'); 

출력 예 : 다음 [2,3]

당신은 단지 (가장 큰 가치를 얻을 ID)를 배열에 추가하고 값 +1에 더합니다.

$auto_increment_id = max($idsList) + 1; 

그래서 이미 말했듯이, 당신은 항상 고유 한 ID를 작성합니다.

즉, 건배! 코드에 따라

전체 예 : 내가 찾던 정확히 무엇을

$file = file_get_contents("data.json"); 
$data = json_decode($file, true); 

// Get IDs list 
$idsList = array_column($data, 'id'); 
// Get unique id 
$auto_increment_id = max($idsList) + 1; 

$data[] = array(
    'id'    => $auto_increment_id, 
    'title'   => $_POST["title"], 
    'artist'   => $_POST["artist"], 
    'genre'   => $_POST["genre"], 
    'week'   => $_POST["week"], 
    'highest_rating' => $_POST["highest_rating"], 
    'year'   => $_POST["year"], 
    'youtube'  => $_POST["youtube"], 
    "links"   => [ 
     array(
      "rel"=>"self", 
      "href"=>"" 
     ), 
     array(
      "rel"=>"collection", 
      "href"=>"" 
     ) 
    ] 
); 

file_put_contents('data.json',json_encode($data), LOCK_EX);