额外'\';在使用JSON.NET将C#对象转换为JSON时进行comign

额外'\';在使用JSON.NET将C#对象转换为JSON时进行comign,c#,asp.net,json,json.net,C#,Asp.net,Json,Json.net,我正在使用JSON.NET库将C#列表转换为JSON。转换对象后,当我查看quick watch时,我可以看到每个属性都有额外的“\”。我通过一个控制器(asp.net MVC控制器)将这些数据发送到一个JavaScript客户端。发送数据时,数据具有额外的“\”。如何删除这些额外的“\” 我的控制器: public class MyController : myBase { public string Get(string id = null, string userN

我正在使用JSON.NET库将C#列表转换为JSON。转换对象后,当我查看quick watch时,我可以看到每个属性都有额外的“\”。我通过一个控制器(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; }
    }
公共类MyController:myBase
{
公共字符串获取(字符串id=null,字符串用户名=null)
{
List dataList=新列表();
数据d=新数据();
d、 Name=“FireFox”;
d、 文件夹=@“测试\Mac OSX”;
数据表.添加(d);
d=新数据();
d、 Name=“Safari”;
d、 文件夹=@“测试\Mac OSX”;
数据表.添加(d);
d=新数据();
d、 Name=“Chrome”;
d、 文件夹=@“测试\Mac OSX”;
数据表.添加(d);
d=新数据();
d、 Name=“FireFox”;
d、 文件夹=@“测试\Windows”;
数据表.添加(d);
d=新数据();
d、 Name=“Safari”;
d、 文件夹=@“测试\Windows”;
数据表.添加(d);
d=新数据();
d、 Name=“Chrome”;
d、 文件夹=@“测试\Windows”;
数据表.添加(d);
d=新数据();
d、 Name=“互联网爆炸器”;
d、 文件夹=@“测试\Windows”;
数据表.添加(d);
d=新数据();
d、 Name=“Chrome”;
d、 文件夹=@“测试\Linux”;
数据表.添加(d);
d=新数据();
d、 Name=“Firefox”;
d、 文件夹=@“测试\Linux”;
数据表.添加(d);
d=新数据();
d、 Name=“测试第一个孩子”;
d、 文件夹=@“测试”;
数据表.添加(d);
d=新数据();
d、 Name=“第一个孩子”;
d、 文件夹=null;
数据表.添加(d);
节点根=新节点();
foreach(数据列表中的数据da)
{
节点父节点=根节点;
如果(!string.IsNullOrEmpty(da.Folder))
{
节点子节点=null;
foreach(da.Folder.Split中的字符串部分(新字符[]{'\\'},StringSplitOptions.RemoveEmptyEntries))
{
字符串名称=part.Trim();
child=parent.children.Find(n=>n.Name==Name);
if(child==null)
{
子节点=新节点{Name=Name};
parent.children.Add(child);
}
父母=子女;
}
}
//始终添加叶节点。
Add(新节点{Name=da.Name});
}
字符串输出=JsonConvert.SerializeObject(根);
返回输出;
}
}
公共类数据
{
公共字符串名称{get;set;}
公用字符串文件夹{get;set;}
}
类节点
{
公共节点()
{
children=新列表();
}
公共列表子项{get;set;}
公共字符串名称{get;set;}
公共布尔叶{get;set;}
公共布尔扩展{get;set;}
}
firefox中的数据---其他控制器正在返回不带“\”的数据

额外的'\'


如何删除这些“\”?您可以在javascript上应用:

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

这会将“\\”转换为“\”

您可以在javascript上应用:

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

调用JsonConvert.SerializeObject时,这应该将“\\”转换为“\”

,然后从控制器返回一个字符串-这具有转义引号的效果,因为内容类型不是“application/json”

如果在发送Json数据之前需要进行额外的处理,您是否可以不使用JsonResult或从JsonResult继承


如果不可能,则需要替换客户端上的转义字符。

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

如果在发送Json数据之前需要进行额外的处理,您是否可以不使用JsonResult或从JsonResult继承


如果不可能,则需要替换客户端上的转义字符。

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

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

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

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

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

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

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

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

您正在