Десериализация JSON в класс C# с именами полей Dynami c - PullRequest
1 голос
/ 17 июня 2020

Мой вопрос очень похож на этот . Я попытался адаптировать их решение под свои нужды, но, похоже, не нашел решения для моего JSON.

Вот пример JSON:

{
  "0fea8f8a-4169-495d-8307-50bc333fd87d": {
    "serviceId": "4cb9125a-1eaa-4bd4-a473-cfccec0f3c63"
  },
  "0564d078-94f5-4f97-8398-b9f58a51f70b": {
    "serviceId": "00000000-0000-0000-0000-000000000000"
  },
  "f9a165d2-967d-4733-8599-1074270dae2e": {
    "serviceId": "00000000-0000-0000-0000-000000000000"
  },
  "86ccdsbf-e7ad-4851-93ff-6ec817469c1e": {
    "serviceId": "00000000-0000-0000-0000-000000000000"
  }
}

Как видите, это серия (а не массив) Id_1 : {serviceId: Id_2}

I думаю, что это проще всего представить в классе C# как-то вроде этого: List<KeyValuePair<string, string>>, в основном список <Id_1, Id_2>, но я открыт для альтернатив.

Вот моя попытка решения, основанного на связанной публикации выше:

class PolicyMetadata
    {
        [JsonConverter(typeof(MetadataConverter))]
        public KeyValuePair<string,string>[] idPairs { get; set; }

    }

class MetadataConverter : JsonConverter
{

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // deserialize as object
        var pairs = serializer.Deserialize<JObject>(reader);
        var result = new List<KeyValuePair<string, string>>();

        // create an array out of the properties
        foreach (JProperty property in pairs.Properties())
        {
            var pair = property.Value.ToObject<KeyValuePair<string, string>>();
            result.Add(pair);
        }

        return result.ToArray();
    }



    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(KeyValuePair<string, string>[]);
    }
}

И я называю это здесь: var response = JsonConvert.DeserializeObject<PolicyMetadata>(content); Но это приводит к нулевому значению, поэтому я определенно делает что-то не так. Я пробовал размещать точки останова и операторы печати в методе Read Json, но они никогда не запускались, поэтому я не уверен, действительно ли этот код выполняется.

1 Ответ

2 голосов
/ 17 июня 2020

Модель:

public class Service
{
    public string ServiceId { get; set; }
}

Использовать словарь:

static void Main()
{
    string json = @"
{
    ""0fea8f8a-4169-495d-8307-50bc333fd87d"": {
    ""serviceId"": ""4cb9125a-1eaa-4bd4-a473-cfccec0f3c63""
    },
    ""0564d078-94f5-4f97-8398-b9f58a51f70b"": {
    ""serviceId"": ""00000000-0000-0000-0000-000000000000""
    },
    ""f9a165d2-967d-4733-8599-1074270dae2e"": {
    ""serviceId"": ""00000000-0000-0000-0000-000000000000""
    },
    ""86ccdsbf-e7ad-4851-93ff-6ec817469c1e"": {
    ""serviceId"": ""00000000-0000-0000-0000-000000000000""
    }
}";

    var result = JsonConvert.DeserializeObject<Dictionary<string, Service>>(json);

    foreach (var pair in result)
    {
        Console.WriteLine("Key: " + pair.Key + " ServiceId: " + pair.Value.ServiceId);
    }
}
...