【问题标题】:One-off Nested JSON Property一次性嵌套 JSON 属性
【发布时间】:2018-10-08 22:58:10
【问题描述】:

我正在与一个 API 交互,该 API 的请求包含此 sn-p:

     "occurrence":{  
        "type":"XYZ"
     }

不是用成员 Type 创建一个 Occurence 对象,而是有一些可以序列化的 Newtonsoft JSON 魔法

  public string Occurence = "XYZ"

改成上面的格式?

【问题讨论】:

  • 该字段与 JSON 表示几乎没有共同之处。为什么field 应该成为一个对象? type 来自哪里?您需要将一种形式转换 到另一种形式。无论您使用 JSON.NET 对象还是匿名类型(例如 new {occurrence=new {type="XYZ"}}),您仍然需要对其进行转换。
  • 这个 API 有很多这样的单成员对象,所以我正在寻找一种解决方案来最小化类的数量。 JObject 是一种方法,但并不是最安全的选择
  • 然后使用匿名类型。这两种模式没有任何共同之处。您必须以一种或另一种方式将一种转换为另一种。
  • 也不喜欢匿名类型。看起来也许自定义 JsonConverter 是这样做的方法

标签: c# json json.net


【解决方案1】:

您可以使用自定义 JsonConverter 将发生属性的 JSON 表示形式扁平化为类型。

class SomeModel
{
  [JsonConverter(typeof(OccuranceConverter))]
  public string Occurence { get; set; }
}

class OccuranceConverter : JsonConverter<string>
{
  public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
  {
    var json = JObject.Load(reader);
    return json.GetValue("type").Value<string>();
  }

  public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
  {
    var json = new JObject { ["type"] = value };
    json.WriteTo(writer);
  }
}

【讨论】:

  • 是的,这基本上也是我想出的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
相关资源
最近更新 更多