2016-03-25 19 views
0

Ich versuche, Blockchain JSON Api Antwort richtig zu entsprechen, aber es scheint, wie ich es einfach nicht tun kann. Blockchain API Response sieht so aus:C# Regex passend JSON API Antwort richtig

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

Grundsätzlich, wie Sie sehen können. Für jede Adresse ist jede Zeile, auf C# ReadToEnd(), es mir versagt. Aber im Grunde versuche ich das, wenn es Label SMS Einzahlungen Beispiel gibt, dann von "dieser Zeile" wird es diese Adresse nehmen, nirgendwo sonst. Beispiel: label ist Peter, dann nimmt es die Adresse nur von der Peter-Linie, nicht von einer anderen Linie. Wie könnte ich das tun? Hier ist auch mein Code:

listAddresses.Method = "GET"; 
    HttpWebResponse listAddressesResp = (HttpWebResponse)listAddresses.GetResponse(); 
    StreamReader listAddressesSR = new StreamReader(listAddressesResp.GetResponseStream()); 
    var resultListAddresses = listAddressesSR.ReadToEnd(); 
    if (resultListAddresses.Contains(name)) 
    { 
     Regex SuiWillThatWork = new Regex("\"address\":\"[A-Za-z0-9]+"); 
     var TestingVol2 = SuiWillThatWork.Match(resultListAddresses).Value; 
     TestingVol2 = TestingVol2.Replace("\"address\":\"", ""); 
     address = TestingVol2; 
     MessageBox.Show(resultListAddresses); 
     MessageBox.Show(address); 
    } 
+3

XY Problem? Anstatt dies zu hacken, gehen Sie auf ['Newtonsoft.Json'] (https://www.nuget.org/packages/Newtonsoft.Json/) und behandeln Sie JSON so, wie es behandelt werden sollte. –

+0

Ja, in Ordnung. Wenn ich es richtig behandle, dann immer noch .. Wie könnte ich diese Information aus dieser "Zeile/Block" regexen – SuiCide

+0

Wenn Sie es wie JSON behandeln, gibt es absolut keinen Grund, RegEx weiter zu verwenden. Und selbst wenn Sie es mit Regex arbeiten würden, 1) wäre es fragil und würde wahrscheinlich nicht unter allen Umständen funktionieren. 2) Zerbrechlich ist besonders wahr, sollte der Hersteller die API/Antwort ändern, 3) es gibt bereits einen Parser-- benutze es. –

Antwort

1

Verwenden Sie nicht Regex für etwas, das bereits einen wirklich schönen Parser entwickelt hat. Gehen Sie selbst einen Gefallen und Install-Package Newtonsoft.Json und versuchen Sie etwas wie folgt:

Zuerst, stellen Sie Objekte, die die Antwort zurückkommen übereinstimmen. Wenn Sie faul sind, gibt es Werkzeuge (wie json2csharp.com), die dies sehr einfach machen. Für Ihre Antwort, wie wäre es so etwas wie die folgenden:

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

Hinweis: Sie müssen die JsonPropertyAttribute Weg nicht gehen, aber Ich mag an meiner Modelle folgen Namenskonventionen machen.

Als nächstes müssen wir die Antwort in unser neues Objekt deserialisieren. Mit Newtonsoft, dann ist es so einfach wie:

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

Sie haben jetzt ein vollhydratisierte Objekt:

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

Um das Problem bei der Hand zurück, jetzt können wir suchen „SMS Einlagen "und die Adresse abrufen:

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

Danke, dass du dir Zeit genommen hast und mir geholfen hast! – SuiCide