【问题标题】:Extra '\' is comign while converting C# object into JSON using JSON.NET使用 JSON.NET 将 C# 对象转换为 JSON 时出现额外的“\”
【发布时间】:2013-12-20 12:39:04
【问题描述】:

我正在使用 JSON.NET 库将 C# 列表转换为 JSON。在我查看快速手表时转换对象后,我可以看到每个属性都有额外的“\”。我通过控制器(asp.net MVC 控制器)将此数据发送到 JavaScript 客户端之一。发送数据时,数据有额外的“\”。如何删除这些额外的“\”?

我的控制器:

public class MyController : myBase
    {
        public string Get(string id = null, string userName = null)
        {
            List<Data> dataList = new List<Data>();

            Data d = new Data();
            d.Name = "FireFox";
            d.Folder = @"Testing\Mac OSX";
            dataList.Add(d);

            d = new Data();
            d.Name = "Safari";
            d.Folder = @"Testing\Mac OSX";
            dataList.Add(d);

            d = new Data();
            d.Name = "Chrome";
            d.Folder = @"Testing\Mac OSX";
            dataList.Add(d);

            d = new Data();
            d.Name = "FireFox";
            d.Folder = @"Testing\Windows";
            dataList.Add(d);

            d = new Data();
            d.Name = "Safari";
            d.Folder = @"Testing\Windows";
            dataList.Add(d);

            d = new Data();
            d.Name = "Chrome";
            d.Folder = @"Testing\Windows";
            dataList.Add(d);

            d = new Data();
            d.Name = "Internet Exploder";
            d.Folder = @"Testing\Windows";
            dataList.Add(d);


            d = new Data();
            d.Name = "Chrome";
            d.Folder = @"Testing\Linux";
            dataList.Add(d);

            d = new Data();
            d.Name = "Firefox";
            d.Folder = @"Testing\Linux";
            dataList.Add(d);

            d = new Data();
            d.Name = "Testing First Child";
            d.Folder = @"Testing";
            dataList.Add(d);

            d = new Data();
            d.Name = "First Child";
            d.Folder = null;
            dataList.Add(d);


            Node root = new Node();
            foreach (Data da in dataList)
            {
                Node parent = root;
                if (!string.IsNullOrEmpty(da.Folder))
                {
                    Node child = null;
                    foreach (string part in da.Folder.Split(new char[] {'\\'}, StringSplitOptions.RemoveEmptyEntries))
                    {
                        string name = part.Trim();
                        child = parent.children.Find(n => n.Name == name);
                        if (child == null)
                        {
                            child = new Node {Name = name};
                            parent.children.Add(child);
                        }
                        parent = child;
                    }
                }
                //Always adds the leaf node.
                parent.children.Add(new Node {Name = da.Name});
            }

            string output = JsonConvert.SerializeObject(root);
            return output;

        }

    }

    public class Data
    {
        public string Name { get; set; }
        public string Folder { get; set; }
    }

    class Node
    {
        public Node()
        {
            children = new List<Node>();
        }

        public List<Node> children { get; set; }
        public string Name { get; set; }
        public bool leaf { get; set; }
        public bool expanded { get; set; }
    }

firefox 中的数据 --- 其他控制器返回的数据没有 '\'

额外的'\'

如何删除这些“\”?

【问题讨论】:

  • 您可以粘贴您的控制器代码以便我们查看您在做什么吗?
  • 这是来自 QuickWatch 的神器。了解你的工具,不要解决不存在的问题。
  • @HenkHolterman:我知道当我们在快速观看中看到数据时,额外的“\”是为了显示目的。但即使是通过发送到客户端的输出也包含“\”。当我查看已序列化为 json 的其他对象时,它们没有额外的 '\'
  • @ChrisW:添加代码
  • JS 代码是做什么用的?我仍然不相信这里存在实际问题。如果它反序列化,那么一切都很好。

标签: c# asp.net json json.net


【解决方案1】:

您在 JSON 中序列化对象,然后通过方法返回此字符串 - 现在它是对象的字符串表示形式。 JSON Web 服务 API 然后获取这个字符串,并对其进行编码以确保它是一个有效的 JS 字符串 - 因此所有引号都会转义。

基本上,您正在执行双重编码。直接返回根对象,而不是字符串,一切都会好起来的:)

【讨论】:

  • 我明白了。问题是我返回一个复合对象并将 JSON 对象(序列化根)作为字符串属性添加到该复合对象中。我不能只返回根对象。它必须是另一个复合对象的一部分。
  • @Brown_Dynamite:这没关系 - 只需返回父对象,它有一个带有根的字段。为什么不应该这样工作?不要自己组合 JSON,你只会犯很多错误。把它留给序列化器,这是他的工作:P
【解决方案2】:

ASP.Net Web API 应该为您进行 JSON 转换,因此您无需将返回对象转换为字符串并返回它。您可以只返回您想要作为 JSON 发回的对象(在本例中为 root)。你的方法就变成了:

public Node Get(string id = null, string userName = null)

正如 Chris W 所提到的,您的客户端调用代码需要设置内容类型,或接受头字段为“application/json”,以便 MVC Web API 知道以 JSON 格式发送回数据。

【讨论】:

  • 感谢您的回复。我明白你的意思了。问题是我返回一个复合对象并将 JSON 对象(序列化根)作为字符串属性添加到该复合对象中。我不能只返回根对象。它必须是另一个复合对象的一部分。
  • 感谢您的回答。这说得通。 +1
【解决方案3】:

当您调用 JsonConvert.SerializeObject 时,您会从控制器返回一个字符串 - 这具有转义引号的效果,因为内容类型不是“application/json”。

如果需要在返回Json数据之前进行额外处理,是否可以不使用JsonResult,或者从JsonResult继承?

如果这不可行,您需要替换客户端上的转义字符。

【讨论】:

    【解决方案4】:

    您可以在您的 javascript 上申请:

    yourStringJSON.replace(/\\\\/g, "\\");
    

    这应该将“\\”转换为“\”

    【讨论】:

    • 感谢巴尔多的回复。但是想了解为什么这些“\”会出现以及如何删除它们(而不是替换它们)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    相关资源
    最近更新 更多