【问题标题】:Character encoding json c# windows phonec# windows phone json字符编码
【发布时间】: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.JsonToStringMobilAirTools.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


【解决方案1】:

问题出在 MARequest 类中:

postStream.Write(byteArray, 0, data.Length);

//替换为

postStream.Write(byteArray, 0, byteArray.Length);

现在开始工作了!

【讨论】:

    猜你喜欢
    • 2013-04-06
    • 2015-07-19
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 2011-04-29
    • 2012-06-05
    相关资源
    最近更新 更多