json数据格式不正确

葫芦娃快救爷爷 2017-09-28 10:32:05
SyntaxError: JSON.parse: unexpected character at line 1 column 66 of the JSON data
这是报错的提示


生成json的代码如下
 
private static string jasonstr=string.Empty;
private static int Countsum=0;
private static void DeptListAdd(DataTable Roledt, DataTable dtSource, int depth)
{
bool isend = false;
string RoleID=Roledt.Rows[depth]["MenuID"].ToString();
DataRow[] drs = dtSource.Select("ParentID=" + RoleID);
for (int i = 0; i < drs.Length; i++)
{
if (depth == 0)
{
isend = false;
jasonstr += "{\"id\":" + drs[i]["id"].ToString() + ",\"MenuName\":\'" + drs[i]["MenuName"].ToString() + "',\"MenuLink\":\"" + drs[i]["MenuLink"] + "\"},";
int dp = depth + 1;
Countsum++;
DeptListAdd(Roledt, dtSource,dp);
}
else
{
bool last = i == drs.Length - 1;
isend = last;
jasonstr += "{\"id\":" + drs[i]["id"].ToString() + ",\"MenuName\":\'"+ drs[i]["MenuName"].ToString() +"',\"MenuLink\":\"" + drs[i]["MenuLink"] + "\"}";
Countsum ++;
int dp = depth + 1;
DeptListAdd(Roledt, dtSource, dp);
}
}
if (!isend)
{

jasonstr = jasonstr.Replace(",,", ",").Replace("}{", "},{");
jasonstr += ",";
}

}
       
int count = 0;
string _jsonstr;
_jsonstr = RolemenuBLL.GetRoleMenu(RoleID, out count);
if (!string.IsNullOrEmpty(_jsonstr))
{
_jsonstr = "{\"code\":1,\"msg\":\"Success\",\"count\":" + count + ",\"data\":[" + _jsonstr + "]}";
}
else
{
_jsonstr = "{\"code\":0,\"msg\":\"Failed\",\"count\":" + count + ",\"data\":[null]}";
}

Context.Response.ContentType = "application/json; charset=utf-8";
Context.Response.Write(_jsonstr);
Context.Response.End();
...全文
868 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2017-10-05
  • 打赏
  • 举报
回复
1 column 66 第一行66字符。检查下
  • 打赏
  • 举报
回复
例如 drs[i]["MenuName"] 中有双引号、单引号、换行等等多种字符怎么办?你这个拼字符串的代码实在是太“坑”了。 另外,抛开 json,结构化(多层 Role 结构)编程设计也应该使用强类型的面向领域结构的 class、interface,而不应该用 DataTable 来拼凑。
  • 打赏
  • 举报
回复
一个好的设计,例如
Role GetRole(..... datasource, string topRoleId)
{
    ......
}
这有明确的输入输出强类型,不用什么 static 关键字,这是普通的类型转换函数,能够“用一句话”就将强类型的 Role 对象序列化为准确的 json 字符串。实际上也能看出你可能根本不需要 DataTable。
  • 打赏
  • 举报
回复
还有,关于使用 static 变量拼接内容以及递归这两个配合起来,你的做法是挺奇葩的。我们都知道函数在定义上就要有明确的输入输出,即使不考虑并发执行问题,也要考虑在接口上有明确的输入输入。而你使用static 变量作为隐含的输出,这其实是破坏了规范模式,不是合适的程序设计。
qq_40489603 2017-10-04
  • 打赏
  • 举报
回复
拜一刀 2017-09-28
  • 打赏
  • 举报
回复
我之前就这么连的
爛轲 2017-09-28
  • 打赏
  • 举报
回复
断点调试,看清楚字符串,哪里有问题改哪里,学会调试很关键。不过楼上方案好,不如用个方法
bidisty 2017-09-28
  • 打赏
  • 举报
回复
NB的写法
吉普赛的歌 2017-09-28
  • 打赏
  • 举报
回复
吉普赛的歌 2017-09-28
  • 打赏
  • 举报
回复
哪有你这样接字符串的?很容易出问题的了。 用 Newtonsoft.dll 就好了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using Newtonsoft.Json;
using System.Web;
using System.Reflection;
using System.Collections;
using System.Text.RegularExpressions;

//缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor”
namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}

namespace Util
{
    /// <summary>
    /// Author      : yenange
    /// Date        : 2013-12-11
    /// Description : json 辅助类
    /// </summary>
    public class JsonHelper
    {
        /// <summary>
        /// DataSet 转 JSON . add by ngye, on 2013-02-18.
        /// </summary>
        /// <param name="ds">需要转换的数据源ds</param>
        /// <returns>json字符串</returns>
        public static string DataSetToJson(DataSet ds)
        {
            string json = string.Empty;
            if (ds == null)
                return json;

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);

            try
            {
                using (JsonWriter jw = new JsonTextWriter(sw))
                {
                    JsonSerializer ser = new JsonSerializer();
                    jw.WriteStartArray();

                    foreach (DataTable dt in ds.Tables)
                    {
                        jw.WriteStartObject();
                        jw.WritePropertyName(dt.TableName);

                        jw.WriteStartArray();
                        foreach (DataRow dr in dt.Rows)
                        {
                            jw.WriteStartObject();
                            foreach (DataColumn dc in dt.Columns)
                            {
                                jw.WritePropertyName(dc.ColumnName);
                                ser.Serialize(jw, dr[dc].ToString());
                            }
                            jw.WriteEndObject();
                        }
                        jw.WriteEndArray();
                        jw.WriteEndObject();
                    }
                    jw.WriteEndArray();

                    sw.Close();
                    jw.Close();
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return sb.ToString();
        }

        /// <summary>
        /// DataTable 转 JSON
        /// </summary>
        /// <param name="atable_data">数据源DataTable</param>
        /// <returns>返回DataTable转换成功的Json格式</returns>
        /// 
        public static string DataTableToJson(DataTable dt)
        {
            string s_jsonstring = string.Empty;
            //参数检测
            if (dt == null)
                return s_jsonstring;

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            using (JsonWriter jw = new JsonTextWriter(sw))
            {
                JsonSerializer ser = new JsonSerializer();
                jw.WriteStartArray();
                foreach (DataRow dr in dt.Rows)
                {
                    jw.WriteStartObject();
                    foreach (DataColumn dc in dt.Columns)
                    {
                        jw.WritePropertyName(dc.ColumnName);
                        ser.Serialize(jw, dr[dc].ToString());
                    }
                    jw.WriteEndObject();
                }
                jw.WriteEndArray();
                sw.Close();
                jw.Close();
            }

            return sb.ToString();
        }

        /// <summary>
        /// 把DataRow转换为Json格式
        /// </summary>
        /// <param name="dr">行记录信息</param>
        /// <returns>返回DataRow转换成功的Json格式</returns>
        public static string DataRowToJson(DataRow dr)
        {
            string jsonString = string.Empty;
            //参数检测
            if (dr == null)
                return jsonString;
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            DataTable tableData = dr.Table;
            using (JsonWriter jw = new JsonTextWriter(sw))
            {
                JsonSerializer ser = new JsonSerializer();
                jw.WriteStartArray();
                jw.WriteStartObject();
                foreach (DataColumn dc in tableData.Columns)
                {
                    jw.WritePropertyName(dc.ColumnName);
                    ser.Serialize(jw, dr[dc].ToString());
                }
                jw.WriteEndObject();
                jw.WriteEndArray();
                sw.Close();
                jw.Close();
            }
            return sb.ToString();
        }

        /// <summary>
        /// 将 json 输出到客户端
        /// </summary>
        /// <param name="json">Json格式内容</param>
        public static void ResponseWriteJson(String json)
        {
            HttpContext.Current.Response.ContentType = "text/json";
            HttpContext.Current.Response.Write(json);
        }

        #region Json的序列化和反序列化
        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ToJson(object obj)
        {
            string strJson = string.Empty;
            try
            {
                strJson = Newtonsoft.Json.JsonConvert.SerializeObject(obj, new DateTimeJsonConverter(), new LongJsonConverter());
            }
            catch (Exception)
            {
                //NengLong.CMP.Log.Base.Logging.Logger.Current.Fatal(ex);
            }
            return strJson;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T FromJson<T>(string sJson)
        {
            try
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(sJson, new DateTimeJsonConverter(), new LongJsonConverter());

            }
            catch (Exception)
            {
                //NengLong.CMP.Log.Base.Logging.Logger.Current.ErrorFormat("sJson={0}", ex, sJson);
                //NengLong.CMP.Log.Base.Logging.Logger.Current.Fatal(ex);
            }

            return default(T);
        }

        #endregion

        private class DateTimeJsonConverter : Newtonsoft.Json.JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return typeof(DateTime).IsAssignableFrom(objectType);
            }

            public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
            {
                DateTime dt = (DateTime)value;
                writer.WriteValue(dt.ToString("yyyy-MM-dd HH:mm:ss"));

            }
            public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
            {
                return DateTime.Parse(reader.Value.ToString());
            }
        }
        private class LongJsonConverter : Newtonsoft.Json.JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return typeof(long).IsAssignableFrom(objectType);
            }

            public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
            {
                writer.WriteValue(value.ToString());

            }
            public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
            {
                long v = 0;
                long.TryParse(reader.Value.ToString(), out v);
                return v;
            }
        }

        private class StringJsonConverter : Newtonsoft.Json.JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return typeof(string).IsAssignableFrom(objectType);
            }

            public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
            {
                writer.WriteValue(value.ToString());

            }
            public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
            {
                return System.Web.HttpUtility.UrlDecode(reader.Value.ToString());
            }
        }
    }
}
正怒月神 版主 2017-09-28
  • 打赏
  • 举报
回复
用json.net可以直接 datatable转json

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧