Мой код работает (да!), Который отправляет json на сервер ... был бы признателен за любые мысли по рефакторингу
1) Мой код C# отправляет этот json на сервер
{\ "firstName \": \ "Bill \", \ "lastName \": \ "Gates \", \ "email \": \ "[email protected] \", \ "deviceUUID \": \ "abcdefghijklmnopqrstuvwxyz \ "}
Который мне нужно избавиться от косых черт на стороне сервера .... нехорошо.
2) Я использую application / x-www-form-urlencoded и, вероятно, хочу использовать application / json
Person p = new Person();
p.firstName = "Bill";
p.lastName = "Gates";
p.email = "[email protected]";
p.deviceUUID = "abcdefghijklmnopqrstuvwxyz";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetUri + "newuser.php");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//TODO request.ContentType = "application/json";
JavaScriptSerializer serializer = new JavaScriptSerializer();
string s = serializer.Serialize(p);
textBox3.Text = s;
string postData = "json = " + HttpUtility.UrlEncode(s);
byte[] byteArray = Encoding.ASCII.GetBytes(postData);
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close ();
WebResponse response = request.GetResponse();
//textBox4.Text = (((HttpWebResponse)response).StatusDescription);
dataStream = response.GetResponseStream ();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd ();
textBox4.Text += responseFromServer;
reader.Close ();
dataStream.Close ();
response.Close ();
Код PHP на сервере:
$inbound = $_POST['json'];
// this strips out the \
$stripped = stripslashes($inbound);
$json_object = json_decode($stripped);
echo $json_object->{'firstName'};
echo $json_object->{'lastName'};
echo $json_object->{'email'};
echo $json_object->{'deviceUUID'};





Вы уверены, что у вас там есть косые черты? Это представление отладчика, в котором C# кодирует строку для отображения, но реальные значения, поступающие из JavaScriptSerializer, не имеют косой черты в идентификаторе. Единственное, что может быть экранировано, - это содержимое значения JSON ...
Хорошие мысли ... Я проверил VS и когда установил точку останова на textBox3.Text = s; а затем наведите указатель мыши на предыдущую строку s. Он показывает это:
s = "{\" firstName \ ": \" Bill \ ", \" lastName \ ": \" Gates \ ", \" email \ ": \" [email protected] \ ", \" deviceUUID \ ": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ\"}"
Итак, я проверил и на стороне PHP:
$inbound = $_POST['json'];
var_dump($inbound);
string(124) "{\"firstName\":\"Bill\",\"lastName\":\"Gates\",\"email\":\"[email protected]\",\"deviceUUID\":\"abcdefghijklmnopqrstuvwxyz\"}"
Мне это показалось простым в использовании: http://james.newtonking.com/archive/2008/02/11/linq-to-json-beta.aspx и http://james.newtonking.com/projects/json-net.aspx
JSON.NET великолепен, и его стоит поработать - он делает несколько вещей лучше, чем JavaScriptSerializer, но я точно знаю, что JavaScriptSerializer (и любой другой сериализатор JSON) не будет выводить идентификаторы с косой чертой. Это был бы недействительный JSON.
Понятно
Было 2 проблемы:
Сервер PHP экранировал входящие данные, поэтому мне пришлось использовать косые черты.
http://nz.php.net/magic_quotes
Кроме того, при наведении курсора на свойство в VS отображается косая черта, но
Debug.Write(s);
показал:
[{
"categoryid": "1",
"name": "funny",
"serverimageid": "1",
"dateuploaded": "2008-11-17 16:16:41",
"enabled": "\u0001"
}, {
"categoryid": "2",
"name": "happy",
"serverimageid": "2",
"dateuploaded": "2008-11-17 16:17:00",
"enabled": "\u0001"
}, {
"categoryid": "3",
"name": "sad",
"serverimageid": "3",
"dateuploaded": "2008-11-16 16:17:13",
"enabled": "\u0001"
}]
Спасибо всем.