2013-12-08 110 views
0

我正在向JSON數據發送帶有JSON數據的AJAX POST到Symfony2控制器。如果沒有指定任何數據,控制器會創建一個空記錄並返回成功(無錯誤)。但是,當我在POST中傳遞數據時,它會給我標題中顯示的錯誤。這裏是我的AJAX代碼:無法解碼JSON,語法錯誤 - 格式錯誤JSON

   $.ajax({ 
       dataType: "json", 
       type: "POST", 
       data: { 
         "useruid": "Nothing", 
         "type": "Office in Space", 
         "latitude": "12", 
         "longitude": "100", 
         "displayed": "true", 
         "public": "true", 
         "verified": "true", 
         "street": "Something", 
         "city": "Something", 
         "country": "Space", 
         "region": "North Space", 
         "created": "2009-03-07T00:00:00-0500", 
         "delete_status": "active" 
}, 
       url: "/web/app_dev.php/address/", 
       success: function (responseText) 
       { 
        console.log("Request was successful, data received: " + JSON.stringify(responseText)); 

       }, 
       error: function (error) { 
        alert(JSON.stringify(error)); 
       } 
      }); 

反序列化JSON的,這裏是我的控制器代碼:

public function createAction(Request $request) 
{ 


    $content = $this->get('request')->getContent(); 
    var_dump($content); 
    $serializer = $this->get('jms_serializer'); 
    $entity = $serializer->deserialize($content, 'Name\NameBundle\Entity\Address', 'json'); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

    return array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    ); 

} 

我使用JMSSerializer束。它無法解碼JSON的原因是什麼?我用JSONlint驗證了我的JSON,這沒問題。有任何想法嗎?

**編輯的代碼:新增實體類**

namespace Factory\WebServicesBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

use JMS\Serializer\Annotation\Type; 

/** 
* Address 
* @ORM\Table(name="address") 
* @ORM\Entity 
*/ 
class Address 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer", nullable=false) 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
* @JMS\Serializer\Annotation\Type("integer") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="useruid", type="string", length=200, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $useruid; 

/** 
* @var string 
* 
* @ORM\Column(name="type", type="string", nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $type; 

/** 
* @var string 
* 
* @ORM\Column(name="latitude", type="string", length=120, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $latitude; 

/** 
* @var string 
* 
* @ORM\Column(name="longitude", type="string", length=120, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $longitude; 

/** 
* @var boolean 
* 
* @ORM\Column(name="displayed", type="boolean", nullable=true) 
* @JMS\Serializer\Annotation\Type("boolean") 
*/ 
private $displayed; 

/** 
* @var boolean 
* 
* @ORM\Column(name="public", type="boolean", nullable=true) 
* @JMS\Serializer\Annotation\Type("boolean") 
*/ 
private $public; 

/** 
* @var boolean 
* 
* @ORM\Column(name="verified", type="boolean", nullable=true) 
* @JMS\Serializer\Annotation\Type("boolean") 
*/ 
private $verified; 

/** 
* @var string 
* 
* @ORM\Column(name="street", type="string", length=200, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $street; 

/** 
* @var string 
* 
* @ORM\Column(name="city", type="string", length=200, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $city; 

/** 
* @var string 
* 
* @ORM\Column(name="country", type="string", length=200, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $country; 

/** 
* @var string 
* 
* @ORM\Column(name="locality", type="string", length=200, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $locality; 

/** 
* @var string 
* 
* 
* @ORM\Column(name="region", type="string", length=200, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $region; 

/** 
* @var string 
* 
* 
* @ORM\Column(name="code", type="string", length=100, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
* 
*/ 
private $code; 

/** 
* 
* @var string 
* 
* 
* @ORM\Column(name="pobox", type="string", length=100, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
* 
*/ 
private $pobox; 

/** 
* @var string 
* 
* 
* @ORM\Column(name="telephone", type="string", length=60, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $telephone; 

/** 
* @var string 
* 
* 
* @ORM\Column(name="cellphone", type="string", length=200, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $cellphone; 

/** 
* @var string 
* 
* 
* @ORM\Column(name="email", type="string", length=200, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $email; 

/** 
* @var string 
* 
* 
* @ORM\Column(name="facsmile", type="string", length=60, nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $facsmile; 

/** 
* @var \DateTime 
* 
* 
* @ORM\Column(name="created", type="datetime", nullable=true) 
* @JMS\Serializer\Annotation\Type("DateTime") 
*/ 
private $created; 

/** 
* @var \DateTime 
* 
* 
* @ORM\Column(name="modified", type="datetime", nullable=true) 
* @JMS\Serializer\Annotation\Type("DateTime") 
*/ 
private $modified; 

/** 
* @var string 
* 
* 
* @ORM\Column(name="delete_status", type="string", nullable=true) 
* @JMS\Serializer\Annotation\Type("string") 
*/ 
private $deleteStatus; 
+0

您未發送JSON。您使用鍵值對發送正常的HTTP請求。 – lonesomeday

+0

你可以添加你參考的地址實體嗎?我認爲你的JMS配置可能有問題。 (你必須告訴JMS串行器如何反序列化你的JSON) – Stivni

+0

我已經添加了我引用的地址實體的代碼。我已經跳過了setter和getters,以減少粘貼代碼的長度。使用setter,我可以將數據保存到表中,但是我更喜歡序列化它,而無需每次需要保留字段時都調用setter。寂寞的日子,我不明白你的意思,它不是JSON,因爲JSON基本上是密鑰對,我正在開發它。你能指出JSON有什麼問題嗎? –

回答

2

你必須指示JMS串行如何反序列化的領域。
您可以通過使用註釋來做到這一點,例如@JMS\Serializer\Annotation\Type("string")
JMS串行器documentation列出了所有可能的類型。爲了清楚起見,您將註釋放在要實例化的實體的每個字段上,例如,

/** 
* @var string 
* 
* @JMS\Serializer\Annotation\Type("string") 
* @ORM\Column(name="street", type="string", length=200, nullable=true) 
*/ 
private $street; 

希望這有助於...

+0

我按照建議添加了註釋,但仍然收到相同的錯誤。我發送的JSON數據有問題(顯示在我上面的代碼中)?這很奇怪,如果再次看看已更改的代碼,我會很高興,JMSSerializer還需要反序列化請求嗎? –

+0

@Paulo user2864740關於發佈您的JSON似乎是正確的。請先修復,然後讓我知道你是否還有任何反序列化問題。 – Stivni

+0

是的,我做了更改,我留下了一個評論,說它現在的作品!多謝你們! –

2

問題(至少目前的問題)是JSON是張貼。因此請求體確實 JSON:userId=..&type=..

這是因爲$.ajaxdata序列化到JSON。相反,對象被映射到查詢鍵/值對:

默認情況下,在傳遞給data選項數據作爲對象(在技術上,任何比串除外)將被處理並轉換成一個查詢串,以適應默認的內容類型 「應用程序/ x-WWW的形式,進行了urlencoded」 ..

最簡單的解決方法是實際上發送JSON:

$.ajax({ 
    dataType: "json",    // this is only for the response! 
    type: "POST", 
    data: JSON.stringify(theData), // since (JSON) string, won't be processed 
    // .. 
}) 

請記住,JSON 是文本而JavaScript對象不是JSON!

使用json3.js或同等的墊片來支持較老的/古老的瀏覽器。

+2

我相信這是正確的。您必須將您的JavaScript對象轉換爲JSON字符串。然後,JMS序列化程序將能夠將您的JSON數據映射到類的字段。 – Stivni

+1

更新:我對JSON進行了更改,現在可以使用,謝謝大家。 @Stivni,我對添加@JMS \ Serializer \ Annotation \ Type()的實體字段進行了更改,它確實有效。我還注意到,當我刪除它時,JMSSerializer仍然能夠正確地反序列化數據並創建出色的記錄!對此的好處是我只需要添加僅僅3行代碼就可以使用反序列化數據,取出表單,然後我可以將JSON數據發送到api並且它可以正常工作。我想知道,沒有明確添加該行是否有缺點? –

+0

@Paulo酷,我很高興你已經解決了這個問題。你的意思是「那條線」又是什麼意思? – user2864740