C#json反序列化对象

car*_*ics 3 c# json

我是C#的新手,所以我不太了解它.我想反序列化json对象,但我遇到了一些问题.

这是json对象:

var json  = "[{

  "idSite":"1",
  "visitorId":"a393fed00271f588",
  "actionDetails":[{
     "type":"action",
      "url":"http:\/\/mysite.info\/test-24\/",
      "customVariables":{
                  "1":{
                       "customVariablePageName1":"URL",
                       "customVariablePageValue1":"http:\/\/mysite.info\/p"
                       }
                   },
      "timeSpent":"78",
   }] 

}]";
Run Code Online (Sandbox Code Playgroud)

我试图以这种方式反序列化它:

var visits = JsonConvert.DeserializeObject<VisitorDetails[]>(json);

public class VisitorDetails
{
    public string idSite { get; set; }

    public string visitorId { get; set; }

    public List<ActionDetail> actionDetails { get; set; }
}


public class ActionDetail
{
    public string type { get; set; }

    public string url { get; set; }

    public string timeSpent { get; set; }

    public object customVariables { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,除了"ActionDetails"中的"customVariables",它只是将其设置为object,其中一个值为string:

{
 "1":{
     "customVariablePageName1":"URL",
     "customVariablePageValue1":"http:\/\/mysite.info\/p"
     }
}
Run Code Online (Sandbox Code Playgroud)

它根本没有反序列化.

我需要这个反序列化,所以我可以说:

foreach (var visit in Model.PiwikInfo)
{
   @foreach (var action in visit.actionDetails)
   {
      @if (action.customVariables != null && action.customVariables.Any())
      {
        foreach (var cv in visit.customVariables.Where(cv => cv.HasProperty("customVariablePageName1")))
        {
         <span>URL: @cv.GetProperty("customVariablePageValue1")</span>
        }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 5

嗯,发生这种情况,因为您已指定该customVariables成员是类型System.Object.因此反序列化将导致为其分配字符串值.

因此,我们尝试通过更改customVariables成员变量的类型声明,并在每次更改后检查其反序列化内容,尝试将其塑造成更好地类似于输入JSON结构的形状以及反序列化结果的特定用法.

  1. 把它作为字典:

    public Dictionary<string, object> customVariables { get; set; }
    
    Run Code Online (Sandbox Code Playgroud)

    这将导致字典包含带有键"1"和单个字符串值的单个元素:

    {
        "customVariablePageName1": "URL",
        "customVariablePageValue1": "http://mysite.info/p"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使它成为字典词典:

    public Dictionary<string, Dictionary<string, string>> customVariables { get; set; }
    
    Run Code Online (Sandbox Code Playgroud)

    并打印出这样的反序列化输出:

    var visits = JsonConvert.DeserializeObject<VisitorDetails[]>(json_string);
    
    foreach (var visit in visits)
    {
        Console.WriteLine("Visitor: {0}", visit.visitorId);
        foreach (var detail in visit.actionDetails)
        {
            Console.WriteLine("  Action: {0}", detail.type);
            foreach (var cv in detail.customVariables.Where(x => x.Value.ContainsKey("customVariablePageName1")))
            {
                Console.WriteLine("    Custom variable #{0}", cv.Key);
                Console.WriteLine("    Value: {0}", cv.Value["customVariablePageValue1"]);
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    它类似于您的视图foreach,并将产生以下输出:

    Visitor: a393fed00271f588
      Action: action
        Custom variable #1
        Value: http://mysite.info/p
    
    Run Code Online (Sandbox Code Playgroud)