0

У меня есть json, пытаясь обесценить json, используя Newtonsoft.Json, но я не могу получить некоторые значения в списке.Невозможно сериализовать json keyvaluepair

Это как мой JSON выглядеть

{ 
    "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: Это local_info и service_map динамические данные

Я обычно создаю класс JSon модели с использованием Json2charp

Мой seralization код например

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

Моя модель выглядит так.

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

Только LocalInfo, ServiceMap и PriceMap Это свойства получают нулевые значения. Все обособленно сериализовано.

Pls дайте мне знать, что я делаю неправильно

+0

Всегда ли совпадают числа (т.е. 100, 200, 300, 330 и т. Д.)? – DavidG

+0

Это динамические – Eldho

ответ

0

причиной вашей проблемы являются имена свойств. Они не могут быть непосредственно использованы в C# в качестве идентификаторов mustn't begin with a number (identifier-start-character). Таким образом, свойство, как это недействительно:

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 (который я не знал раньше, действительно хороший инструмент!) Дает вам подсказку, как он генерирует следующий класс:

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

Что вы можете сделать, чтобы позволить десериализации успеха является аннотировать эти свойства (см documentation) и сказать json.net, как они должны быть отображены:

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

Альтернатива:

Вы не должны использовать классы, как PriceMap и т.д., которые были сгенерированы с помощью json2csharp и может прилипнуть с dynamic, как вы уже делали в вашем вопросе.

В основном проблема, которая возникает, - это просто имя свойства. Результат всегда равен нулю, потому что вы сказали json.net через атрибут DataMember, что он должен сопоставить ключ json "PriceMap" с именем price_map. Это не будет работать, поскольку в json нет json-ключа "PriceMap". Вместо этого это просто называется "price_map". Поэтому удалите атрибут DataMember, и свойство будет правильно отображено.


И как побочное примечание: есть интересная особенность паста JSON как классы которые autogenerates необходимых классов для вас, если вы не хотите оставить Visual Studio:

enter image description here

+0

Это динамически генерируется, так как я могу сопоставить это – Eldho

+0

. Имя было проблемой. Моя ошибка я не нашел этого раньше. – Eldho

+0

Pls обновляет ваш ответ тем же, и я могу отметить его как ответ – Eldho