2013-05-29 71 views
0

我正在從Android平板電腦向SQL Server發送信息。我正在用PHP製作的Web服務執行此操作,以JSON格式發送平板電腦中的信息。它工作正常,但我有一個問題。請參閱JSON中的其中一個元素本身就是一個數組。該數組可能有多個條目,或者它可能只有一個條目。我不知道如果你能理解我在說什麼,但這裏有一個例子:JSON單值數組

<plant> 
    <inspection> 
    <problem> 
     <id></id> 
     <category></category> 
     <description></description> 
    </problem> 
    <problem> 
     <id></id> 
     <category></category> 
     <description></description> 
    </problem> 
    </inspection> 
</plant> 

在上面這個例子中,代碼工作正常。正如你所看到的,在這個例子中,檢查有兩個問題。如果它有兩個或更多問題,它可以正常工作。但是,當它只有一個問題時,JSON不會將其寫入數組,並且在我的Web服務中讀取它時遇到問題。下面是我用來將數據轉換爲JSON的Java代碼:

   JSONObject holder = new JSONObject(); 
       JSONObject plant; 
       JSONObject problem; 

       DatabaseHandler handler = new DatabaseHandler(getApplicationContext()); 
       ArrayList<Plant> plants = handler.GetAllPlants(); 
       Inspection inspection; 
       ArrayList<Problem> problems; 

       if (plants != null) { 
        for (int i = 0; i < plants.size(); i++) { 
         plant = new JSONObject(); 
//      handler.SetSynced(plants.get(i)); 
         plant.put("plantID", plants.get(i).getPlantID()); 
         plant.put("dome", plants.get(i).getDome()); 
         plant.put("potholder", plants.get(i).getPotHolder()); 
         plant.put("pot", plants.get(i).getPot()); 

         inspection = handler.GetInspectionSync(plants.get(i)); 
         if (inspection != null) { 
          plant.put("inspectionID", inspection.getInspectionID()); 
          plant.put("inspectionDate", inspection.getInspectionDate()); 
         } 

         problems = handler.GetAllProblems(inspection); 
         for (int k = 0; k < problems.size(); k++) { 
          problem = new JSONObject(); 
          problem.put("problemID", problems.get(k).getProblemID()); 
          problem.put("categoryID", problems.get(k).getCategoryID()); 
          problem.put("problem", problems.get(k).getProblem()); 
          problem.put("nokernel", problems.get(k).getNoKernel()); 
          plant.accumulate("problems", problem); 
         } 
         holder.accumulate("plants", plant); 
        } 

我知道這很sl。。該方案應該以完全不同的方式工作,但在最後一刻,用戶改變了一切,我不得不準時準時完成。這是PHP代碼:

if($conn) { 
    foreach ($input['plants'] as $plant) { 
     $query = 'INSERT INTO plants VALUES(' . $plant['plantID'] . ', ' . $plant['dome'] . ', ' . 
        $plant['potholder'] . ', ' . $plant['pot'] . ');'; 
     $params = array(1, "some data"); 
     $result = sqlsrv_query($conn, $query, $params); 
     $query = 'INSERT INTO inspections VALUES(' . $plant['inspectionID'] . ', ' . $plant['plantID'] . ', \'' . 
        $plant['inspectionDate'] . '\');'; 
     $params = array(1, "some data"); 
     sqlsrv_query($conn, $query, $params); 
     foreach($plant['problems'] as $problem) { 
      $queryP = 'INSERT INTO problems VALUES(' . $problem['problemID'] . ', ' . $problem['categoryID'] . ', ' . 
         $plant['inspectionID'] . ', \'' . $problem['problem'] . '\', \'' . $problem['nokernel'] . '\');'; 
      fwrite($f, $queryP); 
      $params = array(1, "some data"); 
      sqlsrv_query($conn, $queryP, $params); 
     } 
    } 

任何幫助將不勝感激。這是我現在唯一需要解決的問題,最終完成這個項目。

+2

這是在談論JSON,但樣品是表現出XML。 – Orangepill

+0

只是在檢查標記的內容上進行計數,如果它具有> 1個子部分,則將其視爲數組/多個元素,如果其具有一個或更少的元素則視爲單個元素。 – Dave

+1

JSON類似於'{plant:{inspection:{problems:[{id:12,category:15,description:'This is a demo'},{...},{...} ...] }}}}' – JoDev

回答

1

也許前:

foreach($plant['problems'] as $problem) { 

你可以補充一點:

if (is_assoc($plant['problems'])) { 
    $plant['problems'] = array($plant['problems']); 
} 

而這個其他地方:is_assoc function

function is_assoc($array) { 
    return (bool)count(array_filter(array_keys($array), 'is_string')); 
} 
+0

非常感謝。這工作:D – plasmy

+0

我很高興我可以幫助 – Josejulio