My Web API(生成JSON的代码)生成以下JSON字符串。看来,如果我没有错,它已被编码两次:
//1. Add UITextFieldDelegate
class InvoiceViewController: UIViewController, AccessoryToolbarDelegate, UITextFieldDelegate {
//......
//2. Set delegate for the textfields
override func viewDidLoad() {
super.viewDidLoad()
dateIssueTextField.delegate = self
dueDateTextField.delegate = self
//......
}
//3. Update the value of thePicker.date
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
if let fullDate = dateFormatter.date(from: textField.text) {
thePicker.date = fullDate
}
return true
}
}
Web API代码:
"\"[{\\\"SportID\\\":1,\\\"SportName\\\":\"Tennis\\\"},{\"SportID\\\":2,\\\"SportName\\\":\\\"Footbal\\\"},{\"SportID\\\":3,\"SportName\":\\\"Swimming\\\"}]\""
public string JSONTest()
{
List<Sport> sports = new List<Sport>();
sports.Add(new Sport() { SportID = 1, SportName = "Tennis" });
sports.Add(new Sport() { SportID = 2, SportName = "Footbal" });
sports.Add(new Sport() { SportID = 3, SportName = "Swimming" });
try
{
return JsonConvert.SerializeObject(sports);
}
catch (Exception ex) { }
}
上课:
Sport
获取JSON的屏幕截图:
以下行给出了一个错误,我认为是因为两次编码:
public class Sport { public int SportID { get; set; } public string SportName { get; set; } }
如果尝试这个,我会得到同样的错误:
var JavaScriptSerializerResult = (new JavaScriptSerializer()).Deserialize< List<Sport>>(jsonResponse);
如何修复我的Web API不编码两次,或者如果不是问题,我该如何解码这个JSON?
答案 0 :(得分:2)
我认为您应该尝试JsonConvert.DeserializeObject
反序列化JSON:
public class Sport
{
// Dummy "Sport" class as it was not mentioned by OP.
public int SportID { get; set; }
public string SportName { get; set; }
}
我将JSON序列化为:
反序列化:
string json = JSONTest();
var obj = JsonConvert.DeserializeObject<List<Sport>>(json);
输出:
<强>更新强>
根据OP的共享JSON(从服务器接收),可以使用以下命令删除编码:
private string RemoveEncoding(string encodedJson)
{
var sb = new StringBuilder(encodedJson);
sb.Replace("\\", string.Empty);
sb.Replace("\"[", "[");
sb.Replace("]\"", "]");
return sb.ToString();
}
通过以下方式反序列化:
string js = "\"[{\\\"SportID\\\":1,\\\"SportName\\\":\"Tennis\\\"},{\"SportID\\\":2,\\\"SportName\\\":\\\"Footbal\\\"},{\"SportID\\\":3,\"SportName\":\\\"Swimming\\\"}]\"";
string res = RemoveEncoding(js);
var obj = JsonConvert.DeserializeObject<List<Sport>>(res);
答案 1 :(得分:0)
使用Linq查询概念:
public string JSONTest()
{ List<Sport> sports = new List<Sport>();
sports.Add(new Sport() { SportID = 1, SportName = "Tennis" });
sports.Add(new Sport() { SportID = 2, SportName = "Footbal" });
sports.Add(new Sport() { SportID = 3, SportName = "Swimming" });
var result_sports = (from row in sports
group row by new { row.SportID , row.SportName} into hdr
select new Sport()
{
SportID = hdr.Key.SportID ,
SportName = hdr.Key.SportName ,
}).ToList();
string jsondata = new JavaScriptSerializer().Serialize(result_sports);
}
答案 2 :(得分:0)
json.net库的较短样本。
这里,entity是我的可序列化C#对象。我使用JsonConvert和一些格式,并指定忽略引用循环以防止循环引用。
using Newtonsoft.Json;
var json = JsonConvert.SerializeObject (entity, Formatting.Indented,
new JsonSerializerSettings {ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
});
答案 3 :(得分:0)
摘要 :您的返回对象正在被序列化两次。删除手动序列化代码并从Web服务返回对象 - 而不是JSON字符串。
你的JSON确实被序列化了两次&#39;仔细查看此屏幕截图,我们会看到转义引号:
正确序列化的列表应该生成类似这样的JSON字符串:
[{&#34; SportID&#34;:1,&#34; SportName&#34;:&#34;网球&#34;},{&#34; SportID&#34;:2&#34 ; SportName&#34;:&#34;足球普&#34;},{&#34; SportID&#34;:3,&#34; SportName&#34;:&#34;游泳&#34;}]
但我们有更像这样的东西:
&#34; [{\&#34; SportID \&#34;:1,\&#34; SportName \&#34;:\&#34;网球\&#34;},{\ &#34; SportID \&#34;:2,\&#34; SportName \&#34;:\&#34;足球普\&#34;},{\&#34; SportID \&#34; :3,\&#34; SportName \&#34;:\&#34;游泳\&#34;}]&#34;
我可以复制此代码(下面的代码),这意味着您的JSON字符串本身已通过序列化程序提供。
这几乎可以肯定是由于您手动序列化List<Sport>
。您不需要这样做。 Web API为您序列化 - 因此第二次运行序列化程序。
如有必要,更改Web API函数的返回类型,然后代替编写:
return JsonConvert.SerializeObject(sports);
只是做
return sports;
Web API将负责序列化,您将不再使用令人烦恼的引号和转义字符。
我测试的代码转储:
void Main()
{
string json = JSONTest();
Console.WriteLine(json);
var obj = JsonConvert.DeserializeObject<List<Sport>>(json);
string jsonX2 = JsonConvert.SerializeObject(json);
Console.WriteLine(jsonX2);
obj = JsonConvert.DeserializeObject<List<Sport>>(jsonX2); // exception
}
public string JSONTest()
{
List<Sport> sports = new List<Sport>();
sports.Add(new Sport() { SportID = 1, SportName = "Tennis" });
sports.Add(new Sport() { SportID = 2, SportName = "Footbal" });
sports.Add(new Sport() { SportID = 3, SportName = "Swimming" });
return JsonConvert.SerializeObject(sports);
}
public class Sport
{
public int SportID { get; set; }
public string SportName { get; set; }
}