C# json反序列化对象

标签 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",
   }] 

}]";

我正在尝试以这种方式反序列化它:

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; }
}

一切都很好,除了“ActionDetails”中的“customVariables”,它只是将它设置为一个对象,一个值作为字符串:

{
 "1":{
     "customVariablePageName1":"URL",
     "customVariablePageValue1":"http:\/\/mysite.info\/p"
     }
}

它根本不会反序列化它。

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

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>
        }
      }
   }
}

最佳答案

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

因此,让我们尝试通过更改 customVariables 成员变量的类型声明,分两步将其塑造成更类似于输入 JSON 结构和反序列化结果的特定用途的形状,并在每次更改后检查其反序列化的内容。

  1. 让它成为字典:

    public Dictionary<string, object> customVariables { get; set; }
    

    这将生成一个字典,其中包含一个键为 "1" 的元素和一个字符串值:

    {
        "customVariablePageName1": "URL",
        "customVariablePageValue1": "http://mysite.info/p"
    }
    
  2. 让它成为字典中的字典:

    public Dictionary<string, Dictionary<string, string>> customVariables { get; set; }
    

    然后像这样打印它的反序列化输出:

    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"]);
            }
        }
    }
    

    这类似于您的 View 的 foreach,并将产生以下输出:

    Visitor: a393fed00271f588
      Action: action
        Custom variable #1
        Value: http://mysite.info/p
    

关于C# json反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30361885/

相关文章:

c# - 具有整数值的下拉列表上的 ASP.NET mvc 验证标签?

c# - c#编译器如何连接字符串

javascript - 如果 API 数据加载失败,请执行某些操作

php - 将 jQuery ajax 中的 json 数据作为新行插入到表中

php - 将 JSON 数组转换为 php 中的插入查询字符串

json - 将yaml转换为不带结构的json

c# - 使用 Nsubstitute 进行模拟但出现错误

c# - 查询 C# 命名空间和使用

c# - COM+ 包装 ServiceStack (NService.Kit) Redis 客户端排队 VBScript 请求

javascript - 在 React 中迭代 JSON 对象