2016-04-16 10 views
0

zu serialisieren Ich habe json, versuchen, die Json mit Newtonsoft.Json deseralisieren, aber ich kann einige Werte in der Liste nicht erhalten. DieseNicht in der Lage, json keyvaluepair

ist, wie meine Json wie

aussehen
{ 
    "status": "success", 
    "msg": "success", 
    "code": 1, 
    "data": { 
     "country": "India", 
     "countryid": "766", 
     "operator": "Airtel India", 
     "operatorid": "1371", 
     "connection_status": "99", 
     "destination_msisdn": "919895070723", 
     "destination_currency": "INR", 
     "product_list": "100,200,300,330,350,440,500,1000", 
     "service_fee_list": "0.00,0.00", 
     "retail_price_list": "7.50,14.50,21.50,70.50", 
     "wholesale_price_list": "6.05,12.03,29.97,59.85", 
     "local_info_value_list": "100.00,1000.00", 
     "local_info_amount_list": "87.00,175.00,887.00", 
     "local_info_currency": "INR", 
     "authentication_key": "16809", 
     "error_code": "0", 
     "error_txt": "Transaction successful", 
     "nick_name": "eldho", 
     "price_map": { 
      "100": "7.50", 
      "200": "14.50", 
      "300": "21.50", 
      "330": "23.50", 
      "350": "25.00", 
      "440": "31.50", 
      "500": "35.50", 
      "1000": "70.50" 
     }, 
     "local_info": { 
      "100": "87.00", 
      "200": "175.00", 
      "300": "264.00", 
      "330": "290.40", 
      "350": "350.00", 
      "440": "387.20", 
      "500": "442.00", 
      "1000": "887.00" 
     }, 
     "service_map": { 
      "100": "0.00", 
      "200": "0.00", 
      "300": "0.00", 
      "330": "0.00", 
      "350": "0.00", 
      "440": "0.00", 
      "500": "0.00", 
      "1000": "0.00" 
     }, 
     "operator_logo": "https:\/\/fm.transfer-to.com\/logo_operator\/logo-1371", 
     "promo_code": 0, 
     "benef_id": "16598" 
    } 
} 

Update: Diese local_info und service_map sind dynamische Daten

ich in der Regel erstellen Klasse von json Modell Json2charp

Mein seralization Code ist wie dieser

using (var _client = new HttpClient())   
{   
    _client.BaseAddress = new Uri(baseServiceUri); 

    var content = new FormUrlEncodedContent(new[] 
    { 
     new KeyValuePair<string,string>("someparameter",token), 
     new KeyValuePair<string,string>("id",myId.ToString()),   
    }); 

    var response = await _client.PostAsync(new Uri(baseAccessPoint, UriKind.Relative), content); 

    if (!response.IsSuccessStatusCode) 
    { 
     throw new HttpRequestException(response.ReasonPhrase); 
    } 

    //I get value in this 
    var responseResult = await response.Content.ReadAsStringAsync(); 

    //Unable to deseralize it. 
    return JsonConvert.DeserializeObject<BeneficoryMobileDTO>(responseResult, new JsonSerializerSettings() 
    { 
     //NullValueHandling = NullValueHandling.Ignore, 
     Error = JsonDeserializeErrorHandler,  
    }); 
} 

Mein Modell sieht so aus.

[DataContract] 
public class BeneficoryMobileDTO 
{ 
    [DataMember] 
    public string status { get; set; } 

    [DataMember] 
    public string msg { get; set; } 

    [DataMember] 
    public string code { get; set; } 

    [DataMember(Name = "data")] 
    public BeneficoryMobileDetailsDTO BeneficoryMobileDetails { get; set; } 
} 

public class BeneficoryMobileDetailsDTO 
{ 
    //I have removed some property to show things that doesn't work 

    //THIS CAN'T BE SERALIZED 
    [DataMember(Name = "PriceMap")] 
    public dynamic price_map { get; set; } 

    //THIS CAN'T BE SERALIZED 
    [DataMember(Name = "ServiceMap")] 
    public dynamic service_map { get; set; } 

    //THIS CAN'T BE SERALIZED 
    [DataMember(Name = "LocalInfo")] 
    public object LocalInfo { get; set; } 


    [DataMember] 
    public int benef_id { get; set; } 
} 

Nur LocalInfo, ServiceMap und PriceMap Diese Eigenschaften werden immer Null-Werte. Alles andere ist serialisiert.

Pls lassen Sie mich wissen, was ich falsch mache

+0

Sind die Nummern immer gleich (also 100, 200, 300, 330 usw.)? – DavidG

+0

Das sind dynamische – Eldho

Antwort

0

Die Ursache für Ihr Problem sind die Namen der Objekte. Sie können nicht direkt in C# als Bezeichner mustn't begin with a number (identifier-start-character) verwendet werden. So eine Eigenschaft wie folgt ist ungültig:

public string 100 { get; set; } // "100" is an invalid property name 
// generates compiler error CS1519: Invalid token '100' in class, struct, or interface member declaration 

json2csharp (was ich vorher nicht kannten, wirklich ein schönes Werkzeug!) Gibt Ihnen einen Hinweis, wie es die folgende Klasse erzeugt:

public class PriceMap 
{ 
    public string __invalid_name__100 { get; set; } // invalid hint 
    public string __invalid_name__200 { get; set; } 
    // other props omitted 
} 

Was Sie tun können, die Deserialisierung gelingen wird, diese Eigenschaften mit Anmerkungen versehen (siehe documentation) und sagen json.net zu lassen, wie sie abgebildet werden sollen:

public class PriceMap 
{ 
    [JsonProperty(PropertyName = "100")] 
    public string _100 { get; set; } 
    [JsonProperty(PropertyName = "200")] 
    public string _200 { get; set; } 
    // other props omitted 
} 

Alternative:

Sie haben nicht die Klassen wie PriceMap usw. zu verwenden, die von json2csharp erzeugt wurden, und können Stick mit dynamic wie Sie bereits in Ihrer Frage haben.

Grundsätzlich ist das Problem, das auftritt, nur der Name der Eigenschaft. Das Ergebnis ist immer null, weil Sie json.net über das DataMember -Attribut gesagt haben, dass es den JSON-Schlüssel "PriceMap" der Eigenschaft mit dem Namen price_map zuordnen sollte. Dies wird nicht funktionieren, da es keinen Json-Schlüssel "PriceMap" in Ihrem Json gibt. Stattdessen heißt es einfach "price_map". Entfernen Sie also das DataMember -Attribut und die Eigenschaft wird korrekt zugeordnet.


Und als Randbemerkung: Es gibt eine coole Feature Paste JSON als Klassen, die die notwendigen Klassen für Dich generiert automatisch, wenn Sie Visual Studio mögen nicht verlassen:

enter image description here

+0

Dies ist dynamisch generiert so wie könnte ich dies – Eldho

+0

Die Namensgebung war Problem. Mein Fehler, den ich vorher nicht gefunden habe. – Eldho

+0

Pls aktualisieren Sie Ihre Antwort mit dem gleichen, und ich könnte es als Antwort markieren – Eldho