1

j'ai un échantillon JSON comme ceci:Créer DataContract classe en C# de JSON ayant les clés générées dynamiquement

{"'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"}]} 

J'ai créé une classe d'échantillon DataContract comme ceci:

[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; } 

    } 

Maintenant, je veux pour accéder aux attributs en utilisant DataContractJsonSerializer et memorystream, mais le problème est que la clé '1234xxxxxx' dans mon json est générée dynamiquement à chaque fois. Alors, comment dois-je accéder aux attributs dans mon code C#?

+0

'DataContractJsonSerializer' est-il une exigence pour vous? Vous ne pouvez pas utiliser Json.NET? –

+0

Vous pouvez string.replace que deserialize. – Miguel

+0

Ressemble à une copie de [désérialisation JSON de variable nommée paramètre à l'aide de DataContract] (https://stackoverflow.com/questions/33024768/json-deserialization-of-variable-named-parameter-using-datacontract/33027529#33027529). Ou juste sérialiser aa 'Dictionnaire >' en utilisant 'UseSimpleDIctionaryFormat' comme expliqué [ici] (https://stackoverflow.com/questions/4559991/any-way-to-make-datacontractjsonserializer-serialize-dictionaries-properly/27223290 # 27223290). – dbc

Répondre

0

Si DataContractJsonSerializer n'est pas une exigence difficile pour vous, vous pouvez utiliser Json.NET désérialiser l'objet:

JsonConvert.DeserializeObject<IDictionary<string, ICollection<attr>>>(jsonString); 
+0

Je ne peux pas utiliser newtonsoft.json ou la classe system.web.helpers :( – user2575854

0

Ici modèle de données.

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; } 
    } 

méthode ici statique qui trouve et remplace 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; 
     } 

et cela comment vous l'utilisez

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); 

vous pouvez désérialiser problème newJsonStringwithout. Nouvelle propriétéName correspond à RootObject.Attributes. FixJsonDynamicProperty peut également être simplifié avec RegExp.