2016-03-25 20 views
0

Blockchain JSON Api yanıtı doğru şekilde eşleştirmeye çalışıyorum, ancak bunu yapamamış gibi görünüyor. Blockchain API Response şöyle görünür:C# Regex JSON api yanıtı ile eşleşme doğru

{ 
    "addresses": [ 
     { 
      "balance": 1400938800, 
      "address": "1Q1AtvCyKhtveGm3187mgNRh5YcukUWjQC", 
      "label": "SMS Deposits", 
      "total_received": 5954572400 
     }, 
     { 
      "balance": 79434360, 
      "address": "1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq", 
      "label": "My Wallet", 
      "total_received": 453300048335 
     }, 
     { 
      "balance": 0, 
      "address": "17p49XUC2fw4Fn53WjZqYAm4APKqhNPEkY", 
      "total_received": 0 
     } 
    ] 
} 

Temel olarak, görebileceğiniz gibi. Her adres için her satır C# ReadToEnd(), bana bu kadar berbat verir. Ama temelde, eğer etiket SMS Mevduat örneği varsa, o zaman "o satırdan" bu adresi alacaktır, başka hiçbir yerde olmayacağım. Örnek: etiket Peter, sonra sadece başka bir satır değil, sadece Peter hattından adres alır. Bunu nasıl yapabilirim? Ayrıca benim kodum:

+3

XY Sorun? Bunun işe yaraması yerine, ['Newtonsoft.Json'] (https://www.nuget.org/packages/Newtonsoft.Json/) adresine gidin ve tedavi edilmek üzere JSON’u tedavi edin. –

+0

Evet, tamam. Eğer "doğru" davranırsam, o zaman hala .. Bu bilgiyi "satır/blok" dan yeniden ifade edebilirim – SuiCide

+0

JSON gibi davranırsanız, RegEx kullanmaya devam etmek için kesinlikle bir neden yoktur. Ve eğer regex ile çalışmayı başarmış olsaydınız, 1) kırılgan olurdu ve muhtemelen her koşulda işe yaramaz, 2) Fragile özellikle satıcı/API'yi değiştirdiğinde doğrudur, 3) zaten bir ayrıştırıcı var-- kullan. –

cevap

1

Geliştirilmiş gerçekten güzel bir ayrıştırıcıya sahip bir şey için regex kullanmayın. Git kendinize bir iyilik yapın ve Install-Package Newtonsoft.Json ve aşağıdaki gibi bir şey deneyin:

İlk önce, geri gelen yanıtla eşleşen nesneleri oluşturun. Eğer tembel olursanız, bunu yapmak çok kolay araçlar (json2csharp.com gibi) vardır. Yanıtınız için, nasıl aşağıdaki gibi bir şey hakkında:

class ServerResponse 
{ 
    [JsonProperty("addresses")] 
    public List<AddressResponse> Addresses { get; set; } 
} 
class AddressResponse 
{ 
    [JsonProperty("balance")] 
    public long Balance { get; set; } 
    [JsonProperty("address")] 
    public string Address { get; set; } 
    [JsonProperty("label")] 
    public string Label { get; set; } 
    [JsonProperty("total_received")] 
    public long TotalReceived { get; set; } 
} 

Not: Sen JsonPropertyAttribute yol gitmek zorunda değilsiniz, ama benim modelleri adlandırma kurallarını uygulayın yapmak ister.

Ardından, yanıtı yeni nesnemize serpiştirmemiz gerekiyor.

ServerResponse 
    Addresses (List<AddressResponse> (3 items)) 
    Balance  Address       Label   TotalReceived 
    1400938800 1Q1AtvCyKhtveGm3187mgNRh5YcukUWjQC SMS Deposits 5954572400 
    79434360 1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq My Wallet  453300048335 
    0   17p49XUC2fw4Fn53WjZqYAm4APKqhNPEkY null   0 

şimdi "SMS Mevduat arayabilirsiniz, eldeki probleme geri almak için:

var response = JsonConvert.DeserializeObject<ServerResponse>(jsonResponse); 

Artık tamamen hidratlı bir nesne var: Newtonsoft kullanarak, bu kadar kolay "ve aşağıdaki adresi atayın:

var response = JsonConvert.DeserializeObject<ServerResponse>(jsonResponse); 
var smsDeposits = response.Addresses.FirstOrDefault(x => x.Label == "SMS Deposits"); 
if (smsDeposits != null) 
{ 
    MessageBox.Show(smsDeposits.Address); 
} 
+0

Zaman ayırdığınız ve bana yardımcı olduğunuz için teşekkürler! – SuiCide