【发布时间】:2015-01-27 08:19:53
【问题描述】:
我正在向我的服务器发送 json 数据,但编码特殊字符的小问题不起作用:
word的详细信息,服务器收据中的日志为dxc3xa9tails
而不是这样:d\xc3\xa9tails
我在发送数据之前记录数据时的输出甚至没有被编码,因为我看到了“详细信息”。
你知道可能是什么问题吗?谢谢
public void Event(String eventType, Dictionary<String, String> dataOptionnal)
{
jsonData = new JObject();
JToken token = JsonConvert.SerializeObject(data, Formatting.None);
jsonData.Add("track_data", JObject.Parse(token.ToString()));
jsonData.Add(MobilAir.TAG_EVENT_TYPE, eventType);
JToken scdToken = JsonConvert.SerializeObject(jsonData, Formatting.None);
jsonToSendOrSave = scdToken.ToString();
SendTrackData(jsonData, MobilAir.TAG_SDK, MobilAir.TAG_CAT_NAVIGATION, "domain");
}
private void SendTrackData(JObject jsonData, String sc, String cat, String domain)
{
String url = MobilAirTools.BuildUrl(domain);
JObject jsonDataUserInfo = new JObject(),
jsonUser_and_track = new JObject();
MobilAir.AddUserHeadInfo(jsonDataUserInfo, true);
Dictionary<String, String> nameValuePair = new Dictionary<string, string>();
jsonUser_and_track.Add(MobilAir.TAG_USER_INFOS, jsonDataUserInfo);
jsonUser_and_track.Add(MobilAir.TAG_TRACK_EVENT, jsonData);
nameValuePair.Add(MobilAir.TAG_DATA, MobilAirTools.JsonToString(jsonUser_and_track));
dataToSend = MobilAirTools.DictToNameValuePair(nameValuePair);
Debug.WriteLine("event with data :" + dataToSend);
MARequest maRequest = new MARequest(this);
maRequest.Execute(url, dataToSend);
}
/* 调试输出 *data={"user_infos":{"os":"windows_phone","aid":"com.r.tljbn","device_id":"CYakZTww0//d+Fei9vwmSztJ3*Wk=","app_name":" Bonne *Nouvelle","sdk_version":"0.9","os_version":"8.10.14219.0","appli_version":"1","*sc":"sdk","device_name":"RM- 1038_1028","connectivity_type":"wifi","online":"true"},"track_event":{"track_data":{"titre nouvelle":"Un menu Burger-King contre 2630 *dollars。 .."},"timestamp":"1422347948","timezone":"+01:00","event_type":"Vue *nouvelles *détails","user_latitude":"45, 8656597806372","user_longitude":"1,26986204572*196","user_accuracy":"45,8656597806372"}} */ * */
public class MARequest
{
String data = null, url = null;
RequestListener listener;
public MARequest(RequestListener requestListener)
{
this.listener = requestListener;
//allDone.WaitOne();
}
public void Execute(String url, String postData )
{
this.url = url;
this.data = postData;
listener.OnPreExecute();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Headers[HttpRequestHeader.ContentEncoding] = "text";
request.ContentType = "application/x-www-form-urlencoded";
request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
}
private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
byte[] byteArray = Encoding.UTF8.GetBytes(data);
Stream postStream = request.EndGetRequestStream(asynchronousResult);
postStream.Write(byteArray, 0, data.Length);
postStream.Close();
// Start the asynchronous operation to get the response
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}
catch (WebException e)
{
SdkLog.WriteLine(e.Message);
}
}
private void GetResponseCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = streamRead.ReadToEnd();
SdkLog.WriteLine(responseString);
// Close the stream object
streamResponse.Close();
streamRead.Close();
// Release the HttpWebResponse
response.Close();
listener.OnPostExecute(responseString, response.StatusCode, MobilAirTools.GetDomainName(url));
}
catch (WebException e)
{
SdkLog.WriteLine(e.Message);
listener.OnPostExecute(e.Message, HttpStatusCode.NotFound , MobilAirTools.GetDomainName(url));
}
}
}
MobilAirTools 方法:
public static String JsonToString(JObject jobject)
{
return JsonConvert.SerializeObject(jobject, Formatting.None);
}
public static String DictToNameValuePair(Dictionary<String, String> dict)
{
StringBuilder data = new StringBuilder();
foreach (string key in dict.Keys)
{
data.Append(key + "=" + dict[key] + "&");
}
data.Length--;
return data.ToString();
}
【问题讨论】:
-
我们不知道您如何发送数据或如何在服务器上记录数据,这使得我们很难提供帮助......
-
MobilAirTools.JsonToString和MobilAirTools.DictToNameValuePair是什么?你能告诉我们这些的来源吗? -
另外,你能告诉我们输出的确切 JSON 吗?您显示的 JSON 已被一些星号和斜杠字符破坏,因此无效,根据此处:jsonformatter.curiousconcept.com.
-
这是输出 json : {"user_infos":{"os":"windows_phone","aid":"com.r.tljbn","device_id":"CYakZTww0//d+ Fei9vwmSztJ3Wk=","app_name":"Bonne Nouvelle","sdk_version":"0.9","os_version":"8.10.14219.0","appli_version":"1","sc":"sdk","device_name" :"RM-1038_1028","connectivity_type":"wifi","online":"true"},"track_event":{"track_data":{"titre nouvelle":"70e anniversaire de la la libération du camp nazi" },"timestamp":"1422433994","timezone":"+01:00","event_type":"Vue nouvelles 详细信息","user_latitude":"45,865576","user_longitude":"1,269549" ,"user_accuracy":"45,865576"}}
标签: c# json windows-phone