如何使用不一致的模式对JSON进行挑选



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进行挑选的方法中,还有更多方法可以这样做,但是我发现这种方式可以阅读以了解发生了什么。

相关内容

  • 没有找到相关文章

最新更新