我正在使用Newtonsoft.Json将对象解析为json字符串。它会像这样返回一些想法:
{\"code\":-1,\"idName\":\"empty\",\"idValue\":0,\"message\":\"Failed,can not read object from body\"}
我认为它不是一个有效的json字符串,任何人都可以帮我解决这个问题吗?
我想要的是这样的:
{"code":-1,"idName":"empty\",\"idValue\":0,\"message\":\"Failed,can not read object from body\"}
public static class CommonUtility
{
// format response string
public static string FormatResponseString(int code, string idName, long idValue, string message)
{
ResponseString rs = new ResponseString();
rs.code = code;
rs.idName = idName;
rs.idValue = idValue;
rs.message = message;
string json = JsonConvert.SerializeObject(rs);
return json;
}
}
public class ResponseString
{
public int code;
public string idName;
public long idValue;
public string message;
}
编辑:这是来自我可以看到的响应fidder TextView的实际json:
"{\"code\":-1,\"idName\":\"empty\",\"idValue\":0,\"message\":\"Failed,can not read object from body\"}"
场景是这样的: 我将序列化的json字符串放在web api CreateResponse方法中。我可以在fidder中看到响应字符串,就像我在问题中所说的那样是无效的json
Request.CreateResponse(HttpStatusCode.Created, returnString);
returnString
是序列化ResponseString
对象
我不认为这是一个有效的字符串,我错了吗?
答案 0 :(得分:3)
最后,解决这个问题。与你们分享。
根本原因:
我的猜测是它是双序列化问题。
看来 ASP.NET web api 2框架会自动为我们做序列化。这就是为什么我SerializeObject
然后Debug.Write(json)
字符串,它运作良好。
string json = JsonConvert.SerializeObject(rs);
Debug.Write(json);
但是在fiddler调用web API之后,web API返回了无效的json(\“)响应,如上所述。在ios,android设备等其他客户端上也是如此。
因为web api为我做了序列化,我还做了一个额外的显式序列化string json = JsonConvert.SerializeObject(rs);
,这意味着我运行了另一个不需要的parseJson。
根据我的问题,我只是直接将CreateResponse
方法中没有序列化的对象。 Request.CreateResponse(HttpStatusCode.Created, rs);
它为fidder和其他客户端返回有效的json。
如何解决此问题: Request.CreateResponse(HttpStatusCode.Created,rs);
public static class CommonUtility
{
// format response string
public static ResponseString FormatResponseString(int code, string idName, long idValue, string message)
{
ResponseString rs = new ResponseString();
rs.code = code;
rs.idName = idName;
rs.idValue = idValue;
rs.message = message;
return rs ;
}
}
public class ResponseString
{
public int code;
public string idName;
public long idValue;
public string message;
}
并在控制器中
ResponseString rs = new ResponseString();
rs = CommonUtility.FormatResponseString(0, "pacelId", returnPacelId, "Succeed,created items in db success");
return Request.CreateResponse(HttpStatusCode.Created, rs);
答案 1 :(得分:0)
我怀疑你在调试器中看到过。它不是实际的字符串,只是visual studio调试器中的表示。例如,我使用此代码进行了测试:
private static void Main(string[] args)
{
var station = new Station {Name = "Duren Kalibata", LastTemperature = 45, MostRecentDate = DateTime.Now};
var str = JsonConvert.SerializeObject(station);
Console.WriteLine(str);
}
visual studio观看窗口中显示的str
值如何:
如何在控制台中打印实际字符串:
结论:Newtonsoft.Json应该将对象转换为正确的json字符串表示形式。无需进一步努力。
更新:
回应你的编辑,我强烈地感觉它又是另一个工具(fiddler)的相同表现形式。这个\"
代表了许多编程平台中的双引号,因为普通的双引号("
)被认为是字符串的结尾/开头(只是说,如果你错过了那个信息)。