JSON字符串编码两次?

时间:2018-02-22 03:53:05

标签: c# asp.net asp.net-web-api json.net javascriptserializer

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的屏幕截图:

Screenshot of getting 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?

4 个答案:

答案 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序列化为:

enter image description here

反序列化:

string json = JSONTest();
var obj = JsonConvert.DeserializeObject<List<Sport>>(json);

输出:

enter image description here

<强>更新

根据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;仔细查看此屏幕截图,我们会看到转义引号:

enter image description here

正确序列化的列表应该生成类似这样的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; }
}