Почему Android неправильно интерпретирует этот результат JSON

#c# #android #jquery #json #android-webview

#c# #Android #jquery #json #android-webview

Вопрос:

У меня есть .NET страница, которая возвращает JSON объект при передаче параметра.

 @using System.Diagnostics;
@using System.Text;

@{

    string fileName = new FileInfo(this.Request.Url.LocalPath).Name;
    const string logDateFormat = "yyyy-MM-dd HH:mm:ss.fff";

    // All response headers added to resolve error message in firefox
    Response.Charset = Encoding.UTF8.EncodingName;
    Response.ContentEncoding = Encoding.UTF8;
    Response.ContentType = "application/json";
    Response.Headers.Add("Content-Language", "en");

    // no layout - we return raw Json or nothing
    Layout = null;

    // this converts all the keys to lowercase.  fixes case sensitiviy issue
    IDictionary<string, string> queryParam = Request.QueryString.AllKeys.ToDictionary(k => k.ToLowerInvariant(), k => Request.QueryString[k]);

    int MapId;
    string MapIdKey = "mapid";
    Debug.WriteLine(DateTime.Now.ToString(logDateFormat)   " - "   fileName   " - Parsing MapId");
    if(queryParam.ContainsKey(MapIdKey))
    {

        string paramValue;
        queryParam.TryGetValue(MapIdKey, out paramValue);
        MapId = paramValue.AsInt(0);  //default zero if invalid
    }
    else
    {
        MapId = 0;
    }

    IEnumerable<dynamic> data = null;
    string sql = "EXEC sp_map_get_location_units @0";
    Database conn = null;
    if (MapId > 0)
    {
        try
        {
            Debug.WriteLine(DateTime.Now.ToString(logDateFormat)   " - "   fileName   " - Using Connection");
            using (conn = Database.Open("CtOnline_Custom"))
            {
                Debug.WriteLine(DateTime.Now.ToString(logDateFormat)   " - "   fileName   " - Execute Query - "   sql);
                data = conn.Query(sql, MapId);
            }

            Debug.WriteLine(DateTime.Now.ToString(logDateFormat)   " - "   fileName   " - Write Results to browser");
            var jsonData = Json.Encode(data);
            Response.Write(jsonData);
            //Json.Write(data, Response.Output);
            Debug.WriteLine(DateTime.Now.ToString(logDateFormat)   " - "   fileName   " - Finished write to browser");
        }
        catch (Exception ex)
        {
            Debug.Print(ex.GetType().ToString());
            Debug.Print(ex.Message);
            Debug.Print(ex.StackTrace);
            Json.Write("{}", Response.Output);
        }
        finally
        {
            if (conn != null)
            {
                conn.Close();
            }
        }
    }
    else
    {
        Debug.WriteLine(DateTime.Now.ToString(logDateFormat)   " - "   fileName   " - MapId is 0.  Stopping.");
    }
}
  

При просмотре в моем браузере он выглядит как идеально отформатированный JSON

 [{
    "NodeId": 251717,
    "UnitName": "777 D #1",
    "UnitDesc": "CLB29",
    "Latitude": -34.579685211181641,
    "Longitude": 150.81907653808594,
    "AssembledTime": "/Date(1475532051000)/",
    "Heading": 164,
    "Speed": 0
}, {
    "NodeId": 252072,
    "UnitName": "CLB37",
    "UnitDesc": "CLB37",
    "Latitude": -34.423614501953125,
    "Longitude": 150.89083862304688,
    "AssembledTime": "/Date(1473985709000)/",
    "Heading": 0,
    "Speed": 0
}, {
    "NodeId": 252073,
    "UnitName": "CLB35",
    "UnitDesc": "CLB35",
    "Latitude": -34.4235954284668,
    "Longitude": 150.89083862304688,
    "AssembledTime": "/Date(1473985751000)/",
    "Heading": 0,
    "Speed": 0
}, {
    "NodeId": 252074,
    "UnitName": "CLB36",
    "UnitDesc": "CLB36",
    "Latitude": -29.820035934448242,
    "Longitude": 30.833461761474609,
    "AssembledTime": "/Date(1473985801000)/",
    "Heading": 0,
    "Speed": 0
}]
  

При просмотре из браузера по умолчанию в Android он отображается как китайский. Попробуйте сами: http://www.ctrackonline.com.au/ClearyBros/JSON/GetUnitsForLocation?mapid=1

Это означает, что он не может быть правильно использован вызывающей страницей:

 var ajaxOptions = {
    method: "GET",
    url: "/ClearyBros/JSON/GetUnitsForLocation",
    processData: true, //means data sent as querystring
    dataType: "json",
    data: { mapId: mapId },
    timeout: 10 * 1000,
    cache: false,
    headers: { "Accept": "application/json" }
}

$.ajax(ajaxOptions)
.done(function(results) {
  etc etc
  

Я пробовал это на 3 разных планшетах Android. 2 в office и еще один в JB Hifi. Я также установил и протестировал с несколькими браузерами. Сбой с

  • По умолчанию
  • Chrome
  • Opera
  • Встроенный в приложение киоска «KB Remote»

Это работает с Firefox. К сожалению, я не могу использовать это в приложении kiosk.

Я не вижу, как это исправить.

Комментарии:

1. попробуйте удалить этот ответ. ContentEncoding = Encoding.UTF8;

2. Никаких изменений @NishantPardamwar 🙁

3. Успех! Удаление ответа. Charset = Encoding.UTF8.EncodingName; устранил проблему. Какая странная ошибка