GVKun编程网logo

(1)乱码之一:$.getJSON方法解析js文件中的json格式数据,中文乱码(js json编码)

16

此处将为大家介绍关于的详细内容,并且为您解答有关1乱码之一:$.getJSON方法解析js文件中的json格式数据,中文乱码的相关问题,此外,我们还将为您介绍关于$.getJson中文乱码问题、3.自

此处将为大家介绍关于的详细内容,并且为您解答有关1乱码之一:$.getJSON方法解析js文件中的json格式数据,中文乱码的相关问题,此外,我们还将为您介绍关于$.getJson中文乱码问题、3.自定义返回json格式的数据给前台(自定义Controller类中的Json方法)、Ajax中responseText解析json格式数据、Android编程简单解析JSON格式数据的方法示例的有用信息。

本文目录一览:

(1)乱码之一:$.getJSON方法解析js文件中的json格式数据,中文乱码(js json编码)

(1)乱码之一:$.getJSON方法解析js文件中的json格式数据,中文乱码(js json编码)

1.尝试过的所有方法:

(1)在后台代码相应的地方加上ServletActionContext.getResponse().setCharacterEncoding("utf-8");

再改成ServletActionContext.getResponse().setCharacterEncoding("gbk");

尝试结果:均失败!

(2)查看html里面的代码:<Meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

这个没问题

再查看页面引用的js代码<script src="js/class/class.js"></script>,

将其改成 <script src="js/class/class.js" charset="utf-8"></script>,

尝试结果:失败!

(3)查看class.js里面代码:$.getJSON("js/class/datasrc_class.js",function(data) {

感觉可能和跨域问题有关系,于是又改这句代码:

$.getJSON("http://localhost:808/zhaoyang/js/class/datasrc_class.js",function(data) {

尝试结果:失败!

(4)google + 百度,查到一个结果:设置tomcat配置文件,server.xml里面:

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

里面确实已经设置了Encoding,于是改成gbk

尝试结果:失败!

(5)想起以前做过类似使用js里面数据出现乱码的情况,好像是在web.xml中增加了一个配置信息,

貌似就是处理js文件的,于是,找到这块代码:

<mime-mapping>
<extension>js</extension>
<mime-type>text/javascript</mime-type>
</mime-mapping>

将其改成:

<mime-mapping>
<extension>js</extension>
<mime-type>text/javascript;charset=gbk</mime-type>
</mime-mapping>

本认为重新跑服务器,估计差不多了

尝试结果:还是失败!

上述所有结果是:firefox乱码、IE连乱码都不显示!

2.成功方法

其实上述第五种方法可以成功的,只是我少做了一步:右击server,clean一下,然后就是重新启动浏览器,

以防万一,可以清除一下浏览器缓存

$.getJson中文乱码问题

$.getJson中文乱码问题

使用$.getJson如果有中文参数容易有乱码

解决办法:

前台修改为 vardata={name:encodeURI($("#myName").val(),"utf-8")},pwd:"password"}; 后台修改为 Stringname=URLDecoder.decode(request.getParameter("name"),"utf-8");

3.自定义返回json格式的数据给前台(自定义Controller类中的Json方法)

3.自定义返回json格式的数据给前台(自定义Controller类中的Json方法)

在mvc的项目中,我们前台做一些操作时,后台要返回一些结果给前台,这个时候我们就需要有一个状态来标识到底是什么类型的错误,

  例如:

    执行删除的时候,如果操作成功(1行受影响),我们需要返回状态为1并输出返回 “ 删除成功 ” 等提示语

    执行删除的时候,如果没有做任何操作(0行受影响),我们需要返回状态为2并输出返回 “ 删除失败  ”等提示语

    执行删除的时候,如果直接抛异常,我们需要返回状态为3并输出返回 “ 执行sql异常  ”等提示语

代码如下:

[HttpPost]
public ActionResult DelRequest(int id)
{
    try
    {
       if (proBLL.Delete(id))
       {
           return Json("{\"status\":\"1\",\"msg\":\"删除成功\"}", JsonRequestBehavior.AllowGet);
       }
       else
       {
          return Content("{\"status\":\"2\",\"msg\":\"删除失败\"}");
       }
    }
    catch
    {
          return Content("{\"status\":\"3\",\"msg\":\"删除失败\"}");
    }
            
}

 

但是这样写是不是很麻烦(虽然可以赋值粘贴),而且也不是很好控制容易出错,所以渐渐的想写自定义返回json格式数据的方法给前台

 

我们来看看源码:

在通过反编译工具我在System.Web.Mvc程序集中看到有一个类叫JsonResult

JsonResult(class JsonResult : ActionResult) 类源码如下:

namespace System.Web.Mvc
{
    public class JsonResult : ActionResult
    {
        public Encoding ContentEncoding
        {
            get;
            set;
        }

        public string ContentType
        {
            get;
            set;
        }

        public object Data
        {
            get;
            set;
        }

        public JsonRequestBehavior JsonRequestBehavior
        {
            get;
            set;
        }

        public int? MaxJsonLength
        {
            get;
            set;
        }

        public int? RecursionLimit
        {
            get;
            set;
        }

        public JsonResult()
        {
            this.JsonRequestBehavior = JsonRequestBehavior.DenyGet;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
            }
            HttpResponseBase response = context.HttpContext.Response;
            if (!string.IsNullOrEmpty(this.ContentType))
            {
                response.ContentType = this.ContentType;
            }
            else
            {
                response.ContentType = "application/json";
            }
            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }
            if (this.Data != null)
            {
                JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
                if (this.MaxJsonLength.HasValue)
                {
                    javaScriptSerializer.MaxJsonLength = this.MaxJsonLength.Value;
                }
                if (this.RecursionLimit.HasValue)
                {
                    javaScriptSerializer.RecursionLimit = this.RecursionLimit.Value;
                }
                response.Write(javaScriptSerializer.Serialize(this.Data));
            }
        }
    }
}
View Code

 

前面先不过,我们可以看到里面有一个方法 public override void ExecuteResult(ControllerContext context),首先接受一个控制器上下文,后面判断是否允许GET请求什么的等,最后通过 response.Write(javaScriptSerializer.Serialize(this.Data)); 把我们传入的数据序列化给前台

既然我们找到了核心类,但是我们如何使用它了?,其实我们可以看到在Controller类中有几个重载的Json方法:

protected internal JsonResult Json(object data);
protected internal JsonResult Json(object data, string contentType);
protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);
protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior);

 

我们看源码可以很清楚直到前面的几个重载都是调用的最后一个重载方法

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior);

 

源码如下:

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

 

哦,原来直接返回了一个JsonResult方法,那么我们是不是也可以写一个Json的重载,或则自定义一个方法,并调用此方法了?

修改如下:

首先我们可以定义一个枚举

public enum ReturnStatus
{
    SUCCESS = 1,
    FAIL = 2,
    EXCEPTION = 3
}

 

错误消息类:

public class Message
{
     public int Status { get; set; }
     public string Mes { get; set; }
}

然后我们写一个BaseController继承Controller类,并添加一个方法JsonResult

/// <summary>
/// 返回json格式的数据给前台
/// </summary>
/// <param name="status">错误标识</param>
/// <param name="message">错误消息</param>
/// <param name="behavior">是否允许</param>
/// <returns></returns>
protected internal JsonResult JsonResult(ReturnStatus status,string message , JsonRequestBehavior behavior = JsonRequestBehavior.DenyGet)
{

    return this.Json(new Message
    {
      Status = Convert.ToInt32(status),
      Mes = message
    },"application/json", Encoding.UTF8, behavior);

}

 

使用:

[HttpPost]
public ActionResult DelRequest(int id)
{
    try
    {
       if (proBLL.Delete(id))
       {
           return JsonResult(ReturnStatus.SUCCESS, "删除成功");
       }
       else
       {
           return JsonResult(ReturnStatus.FAIL, "删除失败");
       }
    }
    catch
    {
       return JsonResult(ReturnStatus.EXCEPTION, "删除失败");
    }
            
}

 

 

最后总结:

所有的扩展都是看源码出来的,而不是百度出来的

所以一定要多看源码,一定要多看源码,一定要多看源码,一定要多看源码,一定要多看源码........

 

Ajax中responseText解析json格式数据

Ajax中responseText解析json格式数据

Ajax中responseText的json格式数据

  向浏览器发送数据请求,返回的responseText是json数据格式,如果要使用其中的数据,需要进行解析。下面是两种解析方法:

方法一:

  xhr = new XMLHttpRequest()  // 创建XMLHttpRequest对象

  var  data = xhr.responseText;   // 获取响应数据

  var json=JSON.parse(data);  // 使用JSON.parse()进行解析:使用JSON对象的静态方法parse(),将字符串解析为对象。

 

方法二: 

  xhr = new XMLHttpRequest()  // 创建XMLHttpRequest对象

  var  data = xhr.responseText;   // 获取响应数据

  var jsonObject=eval("("+result+")"); // 使用eval() 进行解析,其中"(" + result+ ")"的两个括号是一定要写的,意思是将其中的relult转换成表达式。但是eval() 存在安全隐患。

 

  相关知识点:表达式还是语句?

  如果在行首是一个大括号,那么它到底是表达式还是语句呢?遇到这种情况,JavaScript引擎一律解释为代码块,但是如果非要解析成对象,该怎么办呢?那就在使用括号将其包裹起来,这种情况在eval() 语句中表现的最明显了

eval(''{foo:123}'') // 解析成代码块——表示一个代码块中有一个foo标签,指向一个表达式123
eval(''({foo:123})'') // 解析为一个对象——表示一个对象,其中属性foo,指向了123

 

Android编程简单解析JSON格式数据的方法示例

Android编程简单解析JSON格式数据的方法示例

本文实例讲述了Android编程简单解析JSON格式数据的方法。分享给大家供大家参考,具体如下:

比起XML,JSON主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,显示不如XML直观。

JSON格式 : 

{ "name_A" : "value_A","name_B" : "value_B" }

表示:

name_A = value_A; name_B = value_B;

我将对下面的JSON数据进行解析:

[{"id":"5","version":"5.5","name":"愤怒的小鸟"},{"id":"6","version":"7.0","name":"神庙逃亡"},{"id":"7","version":"3.5","name":"保卫萝卜"}]

代码如下:

  private void parseJSONWithJSONObject(String jsonData) {
    try {
      JSONArray jsonArray = new JSONArray(jsonData);
      for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        String id = jsonObject.getString("id");
        String name = jsonObject.getString("name");
        String version = jsonObject.getString("version");
        Log.d("woider","id is " + id);
        Log.d("woider","name is " + name);
        Log.d("woider","version is " + version);
      }
    } catch (Exception e) {
      e.printstacktrace();
    }
  }

首先获取JSON元素数组:

JSONArray jsonArray = new JSONArray(jsonData);

其次循环获取每个元素:

JSONObject jsonObject = jsonArray.getJSONObject(index);

每次循环保存名称相对应的值:

String name = jsonObject.getString("name");

======================使用GSON========================

GSON是谷歌提供的一个API,它主要就是可以将一段JSON格式的字符串自动映射成一个对象,从而不需要手动编码进行解析。

但是GSON并没有被添加到Android官方的API中,因此如果需要使用这个功能的话,则必须在项目中添加一个GSON的jar包。

首先要建立一个类容纳JSON中的数据,然后实例化 Gson 对象,并通过 fromJson() 方法获取JSON对象集合。

  private void parseJSONWithGSON(String jsonData) {
    Gson gson = new Gson();
    List<App> appList = gson.fromJson(jsonData,new Typetoken<List<App>>() {
    }.getType());
    for (App app : appList) {
      Log.d("woider","id is " + app.getId());
      Log.d("woider","name is " + app.getName());
      Log.d("woider","version is " + app.getVersion());
    }
  }

最后,补上运行截图:

PS:这里再为大家推荐几款比较实用的json在线工具供大家参考使用:

在线JSON代码检验、检验、美化、格式化工具:
http://tools.jb51.net/code/json

JSON在线格式化工具:
http://tools.jb51.net/code/jsonformat

在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson

json代码在线格式化/美化/压缩/编辑/转换工具:
http://tools.jb51.net/code/jsoncodeformat

C语言风格/HTML/CSS/json代码格式化美化工具:
http://tools.jb51.net/code/ccode_html_css_json

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android编程之activity操作技巧总结》、《Android文件操作技巧汇总》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》、《Android视图View技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

今天关于1乱码之一:$.getJSON方法解析js文件中的json格式数据,中文乱码的分享就到这里,希望大家有所收获,若想了解更多关于$.getJson中文乱码问题、3.自定义返回json格式的数据给前台(自定义Controller类中的Json方法)、Ajax中responseText解析json格式数据、Android编程简单解析JSON格式数据的方法示例等相关知识,可以在本站进行查询。

本文标签: