rleonard55 Ответов: 1

Проблема сериализации класса C# с помощью json.net


Хорошо, ребята, я приношу свои извинения, что я совершенно новый потребитель/производитель JSON в целом и первый пользователь json.net. У меня есть класс "RequestDetails", который содержит значения {Requester} через {EMAILS_TO_NOTIFY}, перечисленные в Примере JSON ниже. В принципе, я хочу сгенерировать запрос из Добавить запрос Я могу сериализовать класс нормально, но мне бы хотелось json.net чтобы добавить родителя операция и Подробности "разделы" без создания в противном случае пустых вложенных классов над моим классом RequestDetails, но я немного теряюсь в том, как действовать дальше.

public class RequestDetails
{
    [JsonProperty("REQUESTER")]
    public string Requester { get; set; }
    [JsonProperty("SUBJECT")]
    public string Subject { get; set; }
    [JsonProperty("REQUESTTEMPLATE")]
    public string RequestTemplate { get; set; }
    [JsonProperty("PRIORITY")]
    public string Priority { get; set; }
    [JsonProperty("LEVEL")]
    public string Level { get; set; }
    [JsonProperty("IMPACT")]
    public string Impact { get; set; }
    [JsonProperty("URGENCY")]
    public string Urgency { get; set; }
    [JsonProperty("DESCRIPTION")]
    public string Description { get; set; }
    [JsonProperty("ATTACHMENT_IDS")]
    public IList<string> AttachmentIds { get; set; }
    [JsonProperty("UDF_CHAR1")]
    public string UdfChar1 { get; set; }
    [JsonProperty("UDF_LONG1")]
    public string UdfLong1 { get; set; }
    [JsonProperty("UDF_DATE1")]
    public string UdfDate1 { get; set; }
    [JsonProperty("EMAILS_TO_NOTIFY")]
    public string EmailsToNotify { get; set; }
}



{
   "operation": {
      "Details": {
         "REQUESTER": "Howard Stern",        
         "SUBJECT": "Subject of the request",
         "REQUESTTEMPLATE": "Default Request",
         "PRIORITY": "High",
         "LEVEL": "Tier 1",
         "IMPACT": "Affects Business",
         "URGENCY": "High",
         "DESCRIPTION": "Mail Server is down",
         "ATTACHMENT_IDS": ["1005","1006"],
         "UDF_CHAR1": "Test",
         "UDF_LONG1": "1001",
         "UDF_DATE1": "90080098767654"
         "EMAILS_TO_NOTIFY"  : "howard.stern@zillum.com",
       }
   }
}


Что я уже пробовал:

Я немного погуглил, но сейчас я слишком невежественен, чтобы иметь правильные термины для поиска, боюсь. Я действительно пытался заглянуть в пользовательский JsonConverter просто для того, чтобы "обернуть" свои данные внутри родительских разделов, но мне это не удалось, и я не уверен, что это правильное направление. Мы будем признательны за любую помощь.

1 Ответов

Рейтинг:
12

rleonard55

Хорошо, изучив это подробнее, я считаю, что то, что я хотел сделать, лучше сформулировано, поскольку я хотел обернуть свой объект внутри нескольких вложенных свойств (JProperty). Если есть лучший/более чистый способ сделать это, пожалуйста, дайте мне знать, но пока это делает трюк.

использование атрибута в моем базовом абстрактном классе

[JsonConverter(typeof(InputDataBaseConverter))]


а затем создайте пользовательский конвертер следующим образом:

public class InputDataBaseConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var operation = new JObject();
        var details = new JObject();
        var main = new JObject();

        var type = value.GetType();

        foreach (var prop in type.GetProperties())
        {
            if (!prop.CanRead) continue;
            var propVal = prop.GetValue(value, null);

            if (propVal != null)
                main.Add(prop.Name, JToken.FromObject(propVal, serializer));
            else if(serializer.NullValueHandling == NullValueHandling.Include)
                main.Add(prop.Name, JToken.FromObject("null", serializer));
        }

        operation.AddFirst(new JProperty("Details", main));
        details.AddFirst(new JProperty("operation",operation));
        details.WriteTo(writer);
    }

    /// <summary>
    /// Gets a value indicating whether this <see cref="T:Newtonsoft.Json.JsonConverter"/> can read JSON.
    /// </summary>
    /// <value>
    /// <c>true</c> if this <see cref="T:Newtonsoft.Json.JsonConverter"/> can read JSON; otherwise, <c>false</c>.
    /// </value>
    public override bool CanRead { get; } = false;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new Exception("Not Needed");
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType.IsAssignableFrom(typeof (InputDataBase));
    }
}