鉴于代码:
dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
输出如下:
"{\"Bar\":\"something\"}"
调试大型json文档时很难阅读 - 使用Newtonsoft.Json的内置功能(不是正则表达式或可能破坏事物的黑客攻击)有没有办法使输出成为一个带有valie的字符串:
{Bar: "something"}
答案 0 :(得分:8)
如果在从WebApi方法返回值时发生这种情况,请尝试返回对象本身,而不是序列化对象并返回json字符串。默认情况下,WebApi会将对象序列化为响应中的json;如果你返回一个字符串,它将转义它找到的任何双引号。
所以而不是:
public string Get()
{
ExpandoObject foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
return json;
}
尝试:
public ExpandoObject Get()
{
ExpandoObject foo = new ExpandoObject();
foo.Bar = "something";
return foo;
}
答案 1 :(得分:6)
在查看json
值时,您在调试器中看到的是您应该在C#文件中使用的字符串值,以获取相同的值。
确实可以替换
dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
带
string json = "{\"Bar\":\"something\"}";
不改变程序的行为。
因此,要获得不同的值,您应该更改JsonConvert的工作方式,但JsonConvert符合JSON standard,因此忘记了它!
如果您实际上没有序列化ExpandoObject(也没有任何其他密封类超出您的控制范围),您可以在json中序列化的类型上使用DebuggerDisplayAttribute来定义对象的方式将在调试期间显示(在您的代码中,foo
实例)。
但字符串是一个字符串,VisualStudio是正确的:必须转义双引号。
答案 2 :(得分:4)
试试 JToken.Parse 方法。我发现即使我在调试器中查看 JSON 对象并且它们是正确的,当我去操作它们时,它们最终会被转换为文字(即添加了反斜杠)。 JToken.Parse 方法似乎避免了这种情况。
var token = JToken.Parse(text);
所以在原始问题的情况下,它会是这样的:
dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
var token = JToken.Parse(json);
//Do stuff with token -- not json string
就我而言,问题是使用 JObject.Add(json) 无法识别我的字符串是 json,而只是将整个字符串作为单个属性插入。一旦转换为 Jtoken,JSON 就会被正确解释。
答案 3 :(得分:2)
老问题,但我发现了这个,
在我的情况下,我在调试器中查看JSON字符串,我发现正在添加转义。
当我将JSON打印到控制台时,它没有转义字符。希望它有所帮助。
答案 4 :(得分:1)
很简单,只需返回IHttpActionResult并返回对象
public IHttpActionResult Get()
{
ExpandoObject foo = new ExpandoObject();
foo = //query result
return ok(foo)
}
答案 5 :(得分:0)
您应该使用JavaScriptSerializer.Serialize Method:
,而不是使用Newstonsoft.Jsondynamic foo = new ExpandoObject();
foo.Bar = "something";
var js = new JavaScriptSerializer( );
string json = js.Serialize(foo);
此方法可准确生成您要查找的输出。我读到了它here。
答案 6 :(得分:0)
嘿我只是简单地写出文件
iccTransmitApduBasicChannel()
现在只需运行该程序就可以获得没有黑色斜杠的功能,这对于需要多次保存JSON的大型程序非常有用
答案 7 :(得分:0)
[HttpGet]
public object Get(int id)
{
object result = "";
var db = new dbEntities();
var EO = new System.Dynamic.ExpandoObject() as IDictionary<string, Object>; //needed to return proper JSON without escape slashes
try
{
IEnumerable<usp_GetComplaint_Result> aRow = db.usp_GetComplaint(id);
string DBL_QUOTE = new string(new char[] { '"' });
result = "{";
foreach (usp_GetComplaint_Result oneRow in aRow)
{
System.Reflection.PropertyInfo[] properties = typeof(usp_GetComplaint_Result).GetProperties();
foreach(System.Reflection.PropertyInfo property in properties)
{
var vValue = property.GetValue(oneRow) == null ? "null" : property.GetValue(oneRow);
EO.Add(property.Name,vValue);
}
break;
}
}
catch (Exception ex)
{
result = ex.Message;
EO.Add("Error", result);
}
finally
{
db.Dispose();
}
return Ok(EO);
}