2016-03-25 6 views
0

Blockchain JSON Apiの応答が正しい方法で一致しようとしていますが、できないようです。ブロックチェーンのAPIレスポンスは次のようになります。C#JSON API応答が正しく一致する正規表現

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

基本的にはわかります。各アドレスは、C#ReadToEnd()上の各行であり、それは私を台無しにします。しかし、基本的に私はそれを試しています、もしSMSの預金の例があれば、 "その行"からそのアドレスを取るでしょう。例:labelはPeterで、それ以外の行ではなく、Peter行からのみアドレスを取得します。どうすればいい?私のコードもここにあります:

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問題?これを動かすためにハッキングするのではなく、['Newtonsoft.Json'](https://www.nuget.org/packages/Newtonsoft.Json/)に行き、JSONを扱うべきだとみなしてください。 –

+0

ええ、大丈夫です。その行/ブロックからその情報を再正規化する方法 – SuiCide

+0

JSONのように扱う場合、RegExの使用を続ける理由は全くありません。そして、正規表現を使って作業しても、1)壊れやすく、おそらくすべての環境で動作しません。2)ベンダーがAPI /レスポンスを変更した場合は特に脆いです。3)パーサが既にあります。これを使って。 –

答えて

1

本当にいいパーサーが開発されているものにregexを使わないでください。 Install-Package Newtonsoft.Jsonとし、次のようなものを試してみてください。

最初に戻ってくる応答に一致するオブジェクトを確立してください。あなたが怠けているなら、これを非常に簡単にするツール(例えばjson2csharp.com)があります。あなたの応答のために、どのように次のようなものについて:

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

注:JsonPropertyAttribute道を行く必要はありませんが、私は私のモデルが命名規則に従って作るのが好き。

次に、レスポンスを新しいオブジェクトに逆シリアル化する必要があります。 Newtonsoftを使用して、それは同じくらい簡単です:あなたは今、完全に水和オブジェクト持って

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

:手元に戻って問題に取得するには

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

を、今、私たちはSMS預金」を探すことができますアドレスを取得してください:

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

時間をかけて私を助けてくれてありがとう! – SuiCide