javascript/php老兵,.net newbie在这里。
我正在尝试使用JSON.NET来对JSON数据进行验证,并从API调用返回到某些类实例。
当JSON模式保持一致并与我的课程匹配时,它对大多数API调用都很好。但是,我有一些JSON对象,可以这样返回:
"searchresult":{
"summary":{
"page":"1 of 451",
"relevancy":"100% - 99%",
"count":25,
"query":"some search query"
},
"0":{
"relevance":100,
"id":343,
},
"1":{
"relevance":99,
"id":434,
},
"2":{
...
}
},
处理不一致的架构的最佳方法是什么?
我创建了一个具有"摘要"属性的" searchResult",但是我不确定如何映射其余项目。
为了给您强大的打字,如果该模式始终使用:
- 摘要
- 不同的"相关性"
您可以一个JSONCONVERTER类将其划分为名为摘要的类,并列出"相关性"列表。喜欢:
执行:
string json = @"{
""searchresult"":{
""summary"":{
""page"":""1 of 451"",
""relevancy"":""100% - 99%"",
""count"":25,
""query"":""some search query""
},
""0"":{
""relevance"":100,
""id"":343,
},
""1"":{
""relevance"":99,
""id"":434,
}
}
}";
var searchResult = JsonConvert.DeserializeObject<SearchResult>(json);
ViewModels
[JsonConverter(typeof(Converter))]
class SearchResult
{
public Summary Summary { get; set; }
public List<RelevanceWrapper> Relevances { get; set; }
}
class Summary
{
public string Page { get; set; }
public string Relevancy { get; set; }
public int Count { get; set; }
public string Query { get; set; }
}
class RelevanceWrapper
{
public int Id { get; set; }
public int Relevance { get; set; }
}
JSONCONVERTER
class Converter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jObject = JObject.Load(reader);
var searchResultToken = jObject.GetValue("searchresult");
var searchResult = new SearchResult()
{
Relevances = new List<RelevanceWrapper>()
};
foreach (JProperty prop in searchResultToken)
{
if (prop.Name == "summary")
{
searchResult.Summary = prop.Value.ToObject<Summary>();
}
else
{
searchResult.Relevances.Add(prop.Value.ToObject<RelevanceWrapper>());
}
}
return searchResult;
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}
在readjson以及其他json.net进行挑选的方法中,还有更多方法可以这样做,但是我发现这种方式可以阅读以了解发生了什么。