额外'\';在使用JSON.NET将C#对象转换为JSON时进行comign
我正在使用JSON.NET库将C#列表转换为JSON。转换对象后,当我查看quick watch时,我可以看到每个属性都有额外的“\”。我通过一个控制器(asp.net MVC控制器)将这些数据发送到一个JavaScript客户端。发送数据时,数据具有额外的“\”。如何删除这些额外的“\” 我的控制器:额外'\';在使用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
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字符串-因此在所有引号上进行转义 基本上,你在做双重编码。直接返回根对象而不是字符串,一切都会很好:)您正在