0

J'utilise le DataContractJsonSerializer pour convertir une chaîne JSON dans une classe, mais toujours renvoyer un objet vide. J'ai testé la chaîne avec l'extension 'JSON Viewer' dans le Bloc-notes, est valide. J'ai recherché un bug pendant longtemps et j'ai comparé d'autres exemples.DataContractJsonSerializer ne fonctionne pas

Ceci est ma chaîne JSON sous une forme abrégée:

{ 
"error":[], 
"result": { 
     "BCH": {"aclass":"currency","altname":"BCH","decimals":10,"display_decimals":5}, 
     "DASH": {"aclass":"currency","altname":"test"} 
    } 
} 

Les classes GetAssetInfoResponse et assetinfo contiennent des propriétés avec DataMember attributs, mais la propriété Résultat (après Deserialize) ne contient pas tous les objets.

[DataContract] 
[KnownType(typeof(AssetInfo))] 
public class GetAssetInfoResponse 
{ 
    [DataMember(Name = "error")] 
    public List<string> Error { get; set; } 

    [DataMember(Name = "result")] 
    public List<Dictionary<string, AssetInfo>> Result { get; set; } 
} 

[DataContract] 
public class AssetInfo 
{ 
    /// <summary> 
    /// Alternate name. 
    /// </summary> 
    [DataMember(Name = "altname")] 
    public string Altname { get; set; } 

    /// <summary> 
    /// Asset class. 
    /// </summary> 
    [DataMember(Name = "aclass")] 
    public string Aclass { get; set; } 

    /// <summary> 
    /// Scaling decimal places for record keeping. 
    /// </summary> 
    [DataMember(Name = "decimals")] 
    public int Decimals { get; set; } 

    /// <summary> 
    /// Scaling decimal places for output display. 
    /// </summary> 
    [DataMember(Name = "display_decimals")] 
    public int DisplayDecimals { get; set; } 
} 

Ceci est mon code de test:

 var stream = new MemoryStream(Encoding.Unicode.GetBytes(strName)) 
     { 
      Position = 0 
     }; 
     var serializer = new DataContractJsonSerializer(typeof(GetAssetInfoResponse)); 
     GetAssetInfoResponse test = (GetAssetInfoResponse)serializer.ReadObject(stream); 

     Console.ReadLine(); 

Je ne peux pas utiliser le Newtonsoft.Json l'extension parce que le projet ne doit pas contenir de dépendances externes. Existe-t-il un autre moyen de transférer des chaînes JSON dans des classes?

Merci pour votre temps

Répondre

1

Vous déclarez Result comme List<Dictionary<string, AssetInfo>> mais du format, il ressemble à un dictionnaire, pas une liste de dictionnaires (parce qu'il commence par {, il est utilisé pour des objets ou des dictionnaires, pas [ qui est utilisé pour les tableaux/listes). Pour utiliser ce format pour les dictionnaires, vous devez configurer la propriété UseSimpleDictionaryFormat

var serializer = new DataContractJsonSerializer(typeof(GetAssetInfoResponse), new DataContractJsonSerializerSettings 
{ 
    UseSimpleDictionaryFormat = true 
}); 

Avec ce paramètre et ce changement, il a travaillé:

public Dictionary<string, AssetInfo> Result { get; set; } 
+0

Merci! Maintenant ça marche. – patbec