【问题标题】:Turn C# object to json string, how to handle double quotation将C#对象转为json字符串,如何处理双引号
【发布时间】:2014-03-10 06:11:40
【问题描述】:

我正在使用 Newtonsoft.Json 将对象解析为 json 字符串。它返回一些这样的想法:

{\"code\":-1,\"idName\":\"empty\",\"idValue\":0,\"message\":\"Failed,can not read object from body\"}

我认为这不是一个有效的 json 字符串,任何人都可以帮我解决吗?

我想要的是这样的:

{"code":-1,"idName":"empty\",\"idValue\":0,\"message\":\"Failed,can not read object from body\"}  

public static class CommonUtility
{
    // format response string
    public static string FormatResponseString(int code, string idName, long idValue, string message)
    {
        ResponseString rs = new ResponseString();
        rs.code = code;
        rs.idName = idName;
        rs.idValue = idValue;
        rs.message = message;

        string json = JsonConvert.SerializeObject(rs);
        return json;
    }
}

public class ResponseString
{
    public int code;
    public string idName;
    public long idValue;
    public string message;
}

编辑:这是我可以看到的响应提琴手 TextView 中的实际 json:

"{\"code\":-1,\"idName\":\"empty\",\"idValue\":0,\"message\":\"Failed,can not read object from body\"}"

场景是这样的: 我将序列化的 json 字符串放在 web api CreateResponse 方法中。我可以在 fidder 中看到响应字符串,就像我在不是有效 json 的问题中所说的那样

Request.CreateResponse(HttpStatusCode.Created, returnString);

returnString是来自序列化ResponseString对象的json字符串

我不认为这是一个有效的字符串,我错了吗?

【问题讨论】:

标签: c# json serialization json.net


【解决方案1】:

最后,解决这个问题。分享给大家。

根本原因:
我的猜测是这是双重序列化问题。 似乎 ASP.NET web api 2 框架会自动为我们进行序列化。这就是为什么我先SerializeObject 然后Debug.Write(json) 字符串,它运行良好。

string json = JsonConvert.SerializeObject(rs);     
Debug.Write(json);

但是在提琴手调用网络 API 之后,网络 API 返回了无效 json(\") 的响应,正如我上面所说的。这在其他客户端(如 ios、android 设备)上发生了同样的情况。

因为 web api 为我进行了序列化,而且我还进行了额外的显式序列化 string json = JsonConvert.SerializeObject(rs); 这意味着我运行另一个不需要的 parseJson。

根据我的问题,我只是直接将未序列化的对象放入CreateResponse 方法中。 Request.CreateResponse(HttpStatusCode.Created, rs); 它为 fidder 和其他客户端返回有效的 json。

我该如何解决这个问题: Request.CreateResponse(HttpStatusCode.Created, rs);

public static class CommonUtility
    {
        // format response string
        public static ResponseString FormatResponseString(int code, string idName, long idValue, string message)
        {
            ResponseString rs = new ResponseString();
            rs.code = code;
            rs.idName = idName;
            rs.idValue = idValue;
            rs.message = message;

            return rs ;
        }
    }

    public class ResponseString
    {
        public int code;
        public string idName;
        public long idValue;
        public string message;
    }

在控制器中

ResponseString rs = new ResponseString();
                        rs = CommonUtility.FormatResponseString(0, "pacelId", returnPacelId, "Succeed,created items in db success");
                        return Request.CreateResponse(HttpStatusCode.Created, rs);

【讨论】:

    【解决方案2】:

    我怀疑你在调试器中看到了。它不是实际的字符串,只是 Visual Studio 调试器中的表示。例如,我用这段代码测试过:

    private static void Main(string[] args)
    {
        var station = new Station {Name = "Duren Kalibata", LastTemperature = 45, MostRecentDate = DateTime.Now};
        var str = JsonConvert.SerializeObject(station);
        Console.WriteLine(str);
    }
    

    str 值如何显示在 Visual Studio 监视窗口中:

    如何在控制台中打印实际字符串:

    结论:Newtonsoft.Json 应该已经将对象转换为正确的 json 字符串表示形式。无需进一步努力。

    更新:

    响应您的编辑,我有一种强烈的感觉,它再次与另一个工具(提琴手)中的相同表示。这个\" 是许多编程平台中双引号的表示,因为普通的双引号 (") 被认为是字符串的结尾/开头(只是说,以防您错过了该信息)。

    【讨论】:

    • thnx for update, i konw \" 是双引号的表示。这是问题所在,android程序员说她收到的也是无效的json字符串。他试图反对json搅拌和她得到了无效 json 格式的异常。
    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2020-01-03
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多