Создайте класс DataContract в С# из Json с динамически сгенерированными ключами

У меня есть образец json:

{"'1234xxxxxx'":[{"AttributeId":"1","AttributeName":"Brand","AttributeValue":""},{"AttributeId":"2","AttributeName":"Color","AttributeValue":"Red4"},{"AttributeId":"3","AttributeName":"Size","AttributeValue":"44"},{"AttributeId":"4","AttributeName":"Resolution","AttributeValue":"Full HD"}]}

Я создал пример класса DataContract следующим образом:

  [System.Runtime.Serialization.DataContract]
public  class Rootobject
{
    [System.Runtime.Serialization.DataMember]
    public attr[] attrs { get; set; }
}

[System.Runtime.Serialization.DataContract]
public  class attr
{
    [System.Runtime.Serialization.DataMember]
    public string AttributeId { get; set; }

    [System.Runtime.Serialization.DataMember]
    public string AttributeName { get; set; }

    [System.Runtime.Serialization.DataMember]
    public string AttributeValue { get; set; }

   }

Теперь я хочу получить доступ к атрибутам с помощью DataContractJsonSerializer и memorystream, но проблема в том, что ключ «1234xxxxxx» в моем json динамически генерируется каждый раз. Итак, как мне получить доступ к атрибутам в моем коде С#?


person user2575854    schedule 13.11.2016    source источник
comment
Является ли DataContractJsonSerializer жестким требованием для вас? Вы не можете использовать Json.NET?   -  person Botond Botos    schedule 13.11.2016
comment
Вы можете string.replace чем десериализовать.   -  person Miguel    schedule 13.11.2016
comment
Похоже на дубликат JSON-десериализации именованного параметра переменной с использованием Контракт данных. Или просто сериализуйте a Dictionary<string, List<attr>> с помощью UseSimpleDIctionaryFormat, как описано здесь.   -  person dbc    schedule 13.11.2016
comment
@botond.botos да, это жесткое требование.   -  person user2575854    schedule 14.11.2016
comment
@Haksu, не могли бы вы объяснить немного больше, так как я новичок в этом :)   -  person user2575854    schedule 14.11.2016
comment
@dbc Я пробовал эту функцию настроек, но у меня ничего не вышло. Это сработало для вас?   -  person user2575854    schedule 14.11.2016


Ответы (2)


Если DataContractJsonSerializer не является для вас жестким требованием, вы можете использовать Json.NET для десериализации объекта:

JsonConvert.DeserializeObject<IDictionary<string, ICollection<attr>>>(jsonString);
person Botond Botos    schedule 13.11.2016
comment
Я не могу использовать класс newtonsoft.json или system.web.helpers :( - person user2575854; 13.11.2016

Вот модель данных.

public class Rootobject
    {
        public Attribute[] Attributes { get; set; }
    }

    public class Attribute
    {
        public string AttributeId { get; set; }
        public string AttributeName { get; set; }
        public string AttributeValue { get; set; }
    }

здесь статический метод, который находит и заменяет DynamicAttributeName

public static string FixJsonDynamicProperty(string jsonString,char matchChar,string newParamName)
        {
            if (string.IsNullOrEmpty(jsonString)|| string.IsNullOrEmpty(newParamName))
            {
                return jsonString;
            }


            var startIndex = jsonString.IndexOf(matchChar);

            var lastIndex = jsonString.IndexOf(matchChar, jsonString.IndexOf(matchChar) + 1);

            if (startIndex >= 0 && lastIndex > startIndex)
            {
                var dynamicParamName = jsonString.Substring(startIndex, lastIndex - startIndex + 1);

              return jsonString.Replace(dynamicParamName, newParamName);

            }

            return jsonString;
        }

и вот как вы его используете

var jsonString ="{\"'1234xxxxxx'\":[{\"AttributeId\":\"1\",\"AttributeName\":\"Brand\",\"AttributeValue\":\"\"},{\"AttributeId\":\"2\",\"AttributeName\":\"Color\",\"AttributeValue\":\"Red4\"},{\"AttributeId\":\"3\",\"AttributeName\":\"Size\",\"AttributeValue\":\"44\"},{\"AttributeId\":\"4\",\"AttributeName\":\"Resolution\",\"AttributeValue\":\"Full HD\"}]}";

    var newJsonString = FixJsonDynamicProperty(jsonString,'\'',nameof(Rootobject.Attributes));

    Console.WriteLine(newJsonString);

вы можете без проблем десериализовать newJsonString. Новое PropertyName совпадает с RootObject.Attributes . Также FixJsonDynamicProperty можно упростить с помощью RegExp .

person Miguel    schedule 14.11.2016