JSON.net-将嵌套对象反序列化为单个列表 [英] JSON.net - Deserialising nested objects to single list

查看:61
本文介绍了JSON.net-将嵌套对象反序列化为单个列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用JSON.net反序列化对C#对象的JSON响应.
我在将嵌套对象转换为C#列表时遇到问题.
我在下面得到了JSON响应.
我想将所有variants下的节点放在C#中的单个List<Variant>中.
如何编辑我的反序列化器,以便可以对其进行反序列化?

I am trying to deserialising a JSON response to C# objects using JSON.net.
I am having issues with converting nested objects to a C# list.
I get the JSON response below.
I want to put all the nodes under variants in a single List<Variant> in C#.
How can I edit my deserialiser so that it can be properly deserialised?

{
  "feature_id": "48808",
  "feature_code": "",
  "company_id": "1",
  "feature_type": "S",
  "parent_id": "0",
  "display_on_product": "Y",
  "display_on_catalog": "N",
  "display_on_header": "N",
  "description": "",
  "lang_code": "nl",
  "prefix": "",
  "suffix": "",
  "categories_path": "30,149,161,218,219,220,221,222,483",
  "full_description": "",
  "status": "A",
  "comparison": "Y",
  "position": "8830",
  "purpose": "find_products",
  "feature_style": "text",
  "filter_style": "checkbox",
  "variants": {
    "61719": {
      "variant_id": "61719",
      "variant": "CEE 230V\\/16A",
      "description": "CEE 230V\\/16A",
      "page_title": "",
      "meta_keywords": "",
      "meta_description": "",
      "lang_code": "nl",
      "feature_id": "48808",
      "url": "",
      "color": "",
      "position": "0",
      "seo_name": null,
      "seo_path": null,
      "image_pair": null
    },
    "61720": {
      "variant_id": "61720",
      "variant": "CEE 400V\\/16A",
      "description": "CEE 400V\\/16A",
      "page_title": "",
      "meta_keywords": "",
      "meta_description": "",
      "lang_code": "nl",
      "feature_id": "48808",
      "url": "",
      "color": "",
      "position": "0",
      "seo_name": null,
      "seo_path": null,
      "image_pair": null
    },
    "61721": {
      "variant_id": "61721",
      "variant": "CEE 400V\\/32A",
      "description": "CEE 400V\\/32A",
      "page_title": "",
      "meta_keywords": "",
      "meta_description": "",
      "lang_code": "nl",
      "feature_id": "48808",
      "url": "",
      "color": "",
      "position": "0",
      "seo_name": null,
      "seo_path": null,
      "image_pair": null
    },
    "61722": {
      "variant_id": "61722",
      "variant": "CEE 400V\\/63A",
      "description": "CEE 400V\\/63A",
      "page_title": "",
      "meta_keywords": "",
      "meta_description": "",
      "lang_code": "nl",
      "feature_id": "48808",
      "url": "",
      "color": "",
      "position": "0",
      "seo_name": null,
      "seo_path": null,
      "image_pair": null
    }
  }
}

C#类:

using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;

namespace CsFeature
{
public partial class Feature
{
    [JsonProperty("feature_id")] public string FeatureId { get; set; }

    [JsonProperty("feature_code")] public string FeatureCode { get; set; }

    [JsonProperty("company_id")] public string CompanyId { get; set; }

    [JsonProperty("feature_type")] public string FeatureType { get; set; }

    [JsonProperty("parent_id")] public string ParentId { get; set; }

    [JsonProperty("display_on_product")] public string DisplayOnProduct { get; set; }

    [JsonProperty("display_on_catalog")] public string DisplayOnCatalog { get; set; }

    [JsonProperty("display_on_header")] public string DisplayOnHeader { get; set; }

    [JsonProperty("description")] public string Description { get; set; }

    [JsonProperty("lang_code")] public string LangCode { get; set; }

    [JsonProperty("prefix")] public string Prefix { get; set; }

    [JsonProperty("suffix")] public string Suffix { get; set; }

    [JsonProperty("categories_path")] public string CategoriesPath { get; set; }

    [JsonProperty("full_description")] public string FullDescription { get; set; }

    [JsonProperty("status")] public string Status { get; set; }

    [JsonProperty("comparison")] public string Comparison { get; set; }

    [JsonProperty("position")] public string Position { get; set; }

    [JsonProperty("variants")] public List<Variant> Variants { get; set; }
}

public class Variant
{
    [JsonProperty("variant_id")] public string VariantId { get; set; }
    [JsonProperty("variant")] public string VariantVariant { get; set; }
    [JsonProperty("description")] public string Description { get; set; }

    [JsonProperty("page_title")] public string PageTitle { get; set; }

    [JsonProperty("meta_keywords")] public string MetaKeywords { get; set; }

    [JsonProperty("meta_description")] public string MetaDescription { get; set; }

    [JsonProperty("lang_code")] public string LangCode { get; set; }

    [JsonProperty("feature_id")] public string FeatureId { get; set; }

    [JsonProperty("url")] public string Url { get; set; }

    [JsonProperty("color")] public string Color { get; set; }

    [JsonProperty("position")] public string Position { get; set; }

    [JsonProperty("seo_name")] public object SeoName { get; set; }

    [JsonProperty("seo_path")] public object SeoPath { get; set; }

    [JsonProperty("image_pair")] public object ImagePair { get; set; }
}

public partial class Feature
{
    public static Feature FromJson(string json)
    {
        return JsonConvert.DeserializeObject<Feature>(json, Converter.Settings);
    }

    public static void HandleDeserializationError(object sender, ErrorEventArgs errorArgs)
    {
        errorArgs.ErrorContext.Handled = true;
    }
}

public static class Serialize
{
    public static string ToJson(this Feature self)
    {
        return JsonConvert.SerializeObject(self, Converter.Settings);
    }
}

public static class Converter
{
    public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
        DateParseHandling = DateParseHandling.None,
        NullValueHandling = NullValueHandling.Ignore,
        DefaultValueHandling = DefaultValueHandling.Ignore,
        Converters =
        {
            new IsoDateTimeConverter {DateTimeStyles = DateTimeStyles.AssumeUniversal}
        },
        Error = Feature.HandleDeserializationError
    };
}
}

推荐答案

您可以采用的一种方法是将JSON .Parse()转换为dynamic对象.

One approach you could take is to .Parse() the JSON into a dynamic object.

例如:

string jsonString = @"Your JSON String";

dynamic parsedJson = JValue.Parse(jsonString);

之后,您应该可以使用LINQ遍历dynamic对象并提取Variant

After that, you should be able to use LINQ to traverse through the dynamic object and extract your Variant

来源:

使用jsonnet-for-dynamic-json-parsing

这篇关于JSON.net-将嵌套对象反序列化为单个列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆