C # синтаксический анализ JSON с использованием JObject.Parse для игнорирования пропущенных полей - PullRequest
0 голосов
/ 30 октября 2018

Возможно ли, чтобы JObject.Parse игнорировал пропущенные поля?

Из моего примера ниже вы можете видеть, что я объявил класс Address и использовал JsonProperty для указания альтернативных имен полей.

Я предоставил 3 примера, есть 3 строки JSON, которые имеют немного другую структуру, только пример 1 соответствует и возвращает объект, примеры 2 и 3 возвращают нуль, потому что отсутствует поле.

Есть ли способ использовать другие JsonProperty, чтобы их можно было игнорировать, если они не предоставлены?

public class Address
{
    [JsonProperty("flat_number")]
    public string FlatNumber { get; set; }

    [JsonProperty("house_number")]
    public string HouseNumber { get; set; }

    [JsonProperty("address")]
    public string Address1 { get; set; }

    [JsonProperty("address2")]
    public string Address2 { get; set; }

    [JsonProperty("town")]
    public string Town { get; set; }

    [JsonProperty("postcode")]
    public string Postcode { get; set; }
}

private static T TryParse<T>(string json) where T : new()
{
    var jSchemaGenerator = new JSchemaGenerator();

    const string license = "license";

    License.RegisterLicense(license);

    var jSchema = jSchemaGenerator.Generate(typeof(T));

    var jObject = JObject.Parse(json);

    return jObject.IsValid(jSchema) ? JsonConvert.DeserializeObject<T>(json) : default(T);
}

//Example 1 with house_number and flat_number
const string json = "{\"house_number\":\"40\",\"flat_number\":\"82\",\"address\":\"Somewhere\",\"address2\":\"Over\",\"town\":\"There\",\"postcode\":\"ZZ991AA\"}";

//Example 2 with house_number but not flat_number
//const string json = "{\"house_number\":\"40\",\"address\":\"Somewhere\",\"address2\":\"Over\",\"town\":\"There\",\"postcode\":\"ZZ991AA\"}";

//Example 3 with flat_number but not house_number 
//const string json = "{\"flat_number\":\"82\",\"address\":\"Somewhere\",\"address2\":\"Over\",\"town\":\"There\",\"postcode\":\"ZZ991AA\"}";

var tryParse = TryParse<AddressTest>(json);

if (tryParse != null)
{

}

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Если json содержит некоторую пару ключ / значение в качестве динамического, значит, вы не знаете, существуют ли эти пары ключ / значение в json или нет

Если ваши объекты не являются фиксированными и данные должны быть конфигурируемыми, то в Newtonsoft.json есть одна особенность, которая будет использоваться здесь, и это [JsonExtensionData]. Читать дальше

Данные расширения теперь записываются при сериализации объекта. Чтение и запись данных расширения позволяет автоматически выполнять обход всех JSON без добавления каждого свойства в тип .NET, к которому вы десериализуетесь. Объявите только те свойства, которые вас интересуют, и пусть данные расширений сделают все остальное.

Теперь ваши house_number и flat_number будут собраны в [JsonExtensionData], поэтому вам больше не нужно обрабатывать пропущенные поля.

Итак, ваш Address класс будет

public class Address
{
    [JsonExtensionData]
    public IDictionary<string, JsonToken> extensionData { get; set; }

    [JsonProperty("address")]
    public string Address1 { get; set; }

    [JsonProperty("address2")]
    public string Address2 { get; set; }

    [JsonProperty("town")]
    public string Town { get; set; }

    [JsonProperty("postcode")]
    public string Postcode { get; set; }
}
0 голосов
/ 30 октября 2018

После еще нескольких копаний я обнаружил JsonProperty, который позволяет игнорировать нули, применяя NullValueHandling = NullValueHandling.Ignore и к FlatNumber, и к HouseNumber. Все примеры возвращают объект. Поэтому изменение класса Address согласно моему примеру ниже работает в сочетании с моим исходным кодом.

public class Address
{
    [JsonProperty("flat_number", NullValueHandling = NullValueHandling.Ignore)]
    public string FlatNumber { get; set; }

    [JsonProperty("house_number", NullValueHandling = NullValueHandling.Ignore)]
    public string HouseNumber { get; set; }

    [JsonProperty("address")]
    public string Address1 { get; set; }

    [JsonProperty("address2")]
    public string Address2 { get; set; }

    [JsonProperty("town")]
    public string Town { get; set; }

    [JsonProperty("postcode")]
    public string Postcode { get; set; }
}
0 голосов
/ 30 октября 2018

Вы можете использовать JsonSerializerSettings для выполнения этой операции. Это будет игнорировать ваши пропавшие члены.

var jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;

JsonConvert.DeserializeObject<YourClass>(jsonResponse, jsonSerializerSettings);
...