Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;无法转换Unicode字符\\uD83C";从asp.net POST方法返回JSON时出错_C#_Asp.net Mvc_Post_Unicode_Json.net - Fatal编程技术网

C# &引用;无法转换Unicode字符\\uD83C";从asp.net POST方法返回JSON时出错

C# &引用;无法转换Unicode字符\\uD83C";从asp.net POST方法返回JSON时出错,c#,asp.net-mvc,post,unicode,json.net,C#,Asp.net Mvc,Post,Unicode,Json.net,我在MVC项目中开发了一个web api。我在post方法中返回一个JToken对象。通常我的api工作正常,但有时在特定数据中,我会出现以下错误: "Message": "An error has occurred.", "ExceptionMessage": "The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-

我在MVC项目中开发了一个web api。我在post方法中返回一个JToken对象。通常我的api工作正常,但有时在特定数据中,我会出现以下错误:

  "Message": "An error has occurred.",
  "ExceptionMessage": "The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.",
  "ExceptionType": "System.InvalidOperationException",
  "StackTrace": null,
  "InnerException": {
  "Message": "An error has occurred.",
  "ExceptionMessage": "Unable to translate Unicode character \\uD83C 
   at index 411 to specified code page."
这是我的发帖方法

public JToken Post([FromBody]Classes.Search search)
    {

        Classes.ReturnSearch returnSearch = new Classes.ReturnSearch();
        try
        {
            string con = System.Configuration.ConfigurationManager.ConnectionStrings["TConnectionString"].ConnectionString;
            SqlConnection cn = new SqlConnection(con);
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SP_Searchi", cn);
            sqlDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            sqlDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@word", search.word));

            sqlDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@num", search.num));
            DataSet d = new DataSet();
            sqlDataAdapter.Fill(d);
            DataTable table = d.Tables[0];

            foreach(DataRow row in table.Rows)
            {
                string result=row[1].ToString();

                returnSearch.search_items.Add(new Classes.SearchItem(row[0].ToString(), row[1].ToString(),search.word));
            }
            returnSearch.status = "Success";


            return JObject.Parse(JsonConvert.SerializeObject(returnSearch));
        }
        catch (Exception e)
        {
            returnSearch.status = "Failed";
            returnSearch.search_items = null;
            ValuesController.Log("Error in Search: "+e.Message);
            return JObject.Parse(JsonConvert.SerializeObject(returnSearch));
        }


    }
怎么了

您的问题是,尽管如此,它还是以某种方式进入了
returnSearch
对象中的一个字符串中。随后,asp.net-mvc框架抛出一个异常,试图将这样一个字符编码为utf-8

您需要做的是确定这个字符是如何进入您的
returnSearch
结果的,并修复潜在的问题。由于您已经在手动将返回的结果转换为
JObject
,为了简化调试,您可以使用以下转换器将所有字符串测试编码为utf-8,并在出现问题时引发异常:

public class EncodingValidatingStringConverter : JsonConverter
{
    readonly Encoding encoding;

    public EncodingValidatingStringConverter()
        : this(Encoding.GetEncoding(Encoding.UTF8.CodePage, new EncoderReplacementFallback("?"), new DecoderExceptionFallback()))
    {
    }

    public EncodingValidatingStringConverter(Encoding encoding)
    {
        if (encoding == null)
            throw new ArgumentNullException();
        this.encoding = encoding;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override bool CanRead { get { return false; } }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var s = (string)value;
        var bytes = encoding.GetBytes(s);
        var sFixed = encoding.GetString(bytes);

        writer.WriteValue(sFixed);
    }
}
然后修改
Post()
方法以捕获并记录
EncoderFallbackException
并按建议处理问题。例如,以下版本的方法在日志记录后使用
字符替换无效字符:

        try
        {
            // Fill in the returnSearch

            // Convert to JObject and return
            var settings = new JsonSerializerSettings
            {
                Converters = new[] { new EncodingValidatingStringConverter(Encoding.GetEncoding(Encoding.UTF8.CodePage, new EncoderExceptionFallback(), new DecoderExceptionFallback())) },
            };
            return JObject.FromObject(returnSearch, JsonSerializer.CreateDefault(settings));
        }
        catch (EncoderFallbackException ex)
        {
            // Log the encoding error for debugging:
            ValuesController.Log("Encoding exception:\n" + ex.ToString());
            // You could log the search parameters or entire search_items list as well if desired.

            // Return whatever seems most advisable, e.g. replacing the bad character with a fallback if preferred.
            var settings = new JsonSerializerSettings
            {
                Converters = new[] { new EncodingValidatingStringConverter(Encoding.GetEncoding(Encoding.UTF8.CodePage, new EncoderReplacementFallback("?"), new DecoderExceptionFallback())) },
            };
            return JObject.FromObject(returnSearch, JsonSerializer.CreateDefault(settings));
        }
        catch (Exception ex)
        {
            returnSearch.status = "Failed";
            returnSearch.search_items = null;
            ValuesController.Log("Error in Search: " + ex.Message);
            var settings = new JsonSerializerSettings
            {
                Converters = new[] { new EncodingValidatingStringConverter(Encoding.GetEncoding(Encoding.UTF8.CodePage, new EncoderReplacementFallback("?"), new DecoderExceptionFallback())) },
            };
            return JObject.FromObject(returnSearch, JsonSerializer.CreateDefault(settings));
        }
请注意,对每个字符串进行测试编码都会对性能产生负面影响,因此一旦解决了根本问题,就应该删除此解决方法

顺便说一句,您可以做的不是
JObject.Parse(JsonConvert.SerializeObject(returnSearch))
。此方法直接写入
JToken
层次结构,无需中间字符串表示,因此应具有更好的性能

您的问题是,尽管如此,它还是以某种方式进入了
returnSearch
对象中的一个字符串中。随后,asp.net-mvc框架抛出一个异常,试图将这样一个字符编码为utf-8

您需要做的是确定这个字符是如何进入您的
returnSearch
结果的,并修复潜在的问题。由于您已经在手动将返回的结果转换为
JObject
,为了简化调试,您可以使用以下转换器将所有字符串测试编码为utf-8,并在出现问题时引发异常:

public class EncodingValidatingStringConverter : JsonConverter
{
    readonly Encoding encoding;

    public EncodingValidatingStringConverter()
        : this(Encoding.GetEncoding(Encoding.UTF8.CodePage, new EncoderReplacementFallback("?"), new DecoderExceptionFallback()))
    {
    }

    public EncodingValidatingStringConverter(Encoding encoding)
    {
        if (encoding == null)
            throw new ArgumentNullException();
        this.encoding = encoding;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override bool CanRead { get { return false; } }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var s = (string)value;
        var bytes = encoding.GetBytes(s);
        var sFixed = encoding.GetString(bytes);

        writer.WriteValue(sFixed);
    }
}
然后修改
Post()
方法以捕获并记录
EncoderFallbackException
并按建议处理问题。例如,以下版本的方法在日志记录后使用
字符替换无效字符:

        try
        {
            // Fill in the returnSearch

            // Convert to JObject and return
            var settings = new JsonSerializerSettings
            {
                Converters = new[] { new EncodingValidatingStringConverter(Encoding.GetEncoding(Encoding.UTF8.CodePage, new EncoderExceptionFallback(), new DecoderExceptionFallback())) },
            };
            return JObject.FromObject(returnSearch, JsonSerializer.CreateDefault(settings));
        }
        catch (EncoderFallbackException ex)
        {
            // Log the encoding error for debugging:
            ValuesController.Log("Encoding exception:\n" + ex.ToString());
            // You could log the search parameters or entire search_items list as well if desired.

            // Return whatever seems most advisable, e.g. replacing the bad character with a fallback if preferred.
            var settings = new JsonSerializerSettings
            {
                Converters = new[] { new EncodingValidatingStringConverter(Encoding.GetEncoding(Encoding.UTF8.CodePage, new EncoderReplacementFallback("?"), new DecoderExceptionFallback())) },
            };
            return JObject.FromObject(returnSearch, JsonSerializer.CreateDefault(settings));
        }
        catch (Exception ex)
        {
            returnSearch.status = "Failed";
            returnSearch.search_items = null;
            ValuesController.Log("Error in Search: " + ex.Message);
            var settings = new JsonSerializerSettings
            {
                Converters = new[] { new EncodingValidatingStringConverter(Encoding.GetEncoding(Encoding.UTF8.CodePage, new EncoderReplacementFallback("?"), new DecoderExceptionFallback())) },
            };
            return JObject.FromObject(returnSearch, JsonSerializer.CreateDefault(settings));
        }
请注意,对每个字符串进行测试编码都会对性能产生负面影响,因此一旦解决了根本问题,就应该删除此解决方法


顺便说一句,您可以做的不是
JObject.Parse(JsonConvert.SerializeObject(returnSearch))
。此方法直接写入
JToken
层次结构,无需中间字符串表示,因此应具有更好的性能

这是一个表情符号修改器。您可能是在解析输入的表情符号(可拆分为多个\u######实例)后看到它的。

这是一个表情符号修改器。您可能是在解析输入的表情符号(可拆分为多个\u######实例)后看到它的。

。这个角色最初是如何出现在您返回的对象中的?我在旋转后修改了您原来的标题重叠循环视图,以便更好地反映问题。如果不需要的话,请随意调回。。这个角色最初是如何出现在您返回的对象中的?我在旋转后修改了您原来的标题重叠循环视图,以便更好地反映问题。如果不需要的话,请随意换回来。