我是 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 结构和反序列化结果的特定用途的形状,并在每次更改后检查其反序列化的内容。
让它成为字典:
public Dictionary<string, object> customVariables { get; set; }
这将生成一个字典,其中包含一个键为
"1"
的元素和一个字符串值:{ "customVariablePageName1": "URL", "customVariablePageValue1": "http://mysite.info/p" }
让它成为字典中的字典:
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/