使用JSON.NET将C#对象转换为JSON时,使用额外的'\'进行调用

时间:2013-12-20 12:39:05

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

我正在使用JSON.NET库将C#list转换为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中的数据---其他控制器返回的数据没有'\' enter image description here

额外'\' enter image description here

如何删除这些'\'?

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

您正在使用JSON序列化对象,然后您将通过该方法返回此字符串 - 现在它是对象的字符串表示形式。然后,JSON Web服务API接受此字符串,并对其进行编码以确保它是有效的JS字符串 - 因此可以转义所有引号。

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

答案 2 :(得分:0)

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

如果你需要在发送Json数据之前做额外的处理,你能否使用JsonResult或继承JsonResult?

如果无法做到这一点,则需要替换客户端上的转义字符。

答案 3 :(得分:-1)

您可以在javascript上申请:

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

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