2016-11-04 1 views
0

にJSON文字列を変換するのに苦労:私はC# オブジェクトに以下の価格の引用のJSONデータを変換する方法に苦しんでいたオブジェクト

{"MyFeed": 
{"@Provider":"SomeProvider","MMM": 
    {"@name":"3M Corp","low":"194.80","high":"136.78","change":"2.80","pctchange":"0.22","ask":"135.15","bid_time":"20161104131845","bid":"134.80"} 
}} 

私はそうのようなC#クラスを作成しました:

public class Quote 
{ 
    public string Provider { get; set; } 
    public Data Info { get; set; } 
} 

public class Data 
{ 
    public string name { get; set; } 
    public decimal low { get; set; } 
    public decimal high { get; set; } 
    public decimal change { get; set; } 
    public decimal pctchange { get; set; } 
    public decimal ask { get; set; } 
    public DateTime bid_time { get; set; } 
    public decimal bid { get; set; } 
} 

次に、コードでは、ちょうど正常に動作するHttpWebRequestを使用してデータを取得しています。しかし、JSONデータを逆シリアル化するステップは機能しません。エラーをスローしません。データはありません。そのコードは次のとおりです。

var request = HttpWebRequest.Create(new Uri("<request URL here>")) as HttpWebRequest; 
    request.Method = "POST"; 
    var response = request.GetResponse(); 
    using (Stream stream = response.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(stream)) 
     { 
      Quote quote = JsonConvert.DeserializeObject<Quote>(reader.ReadToEnd()); 
      lblPrice.Text = string.Format("{0:c}", quote.Data.ask); 
     } 
    } 

私はコードを踏んだので、Webリクエストが動作していて、JSON文字列を返しています。私は、デシリアライズされたデータを受け入れるようにC#クラスをどのように構造化するのか分かりません。助けていただければ幸いです!

答えて

2

は、あなたがこのjson2csharp

+0

それはかなりクールなユーティリティです!それはクラス構造を生成しました。次に、必要に応じてフィールドの名前を変更できます。参照いただきありがとうございます! –

3

このようなプロパティを定義する必要があります。

[JsonProperty(PropertyName = "@Provider")] 
public string Provider { get; set; } 

そして

[JsonProperty(PropertyName = "@name")] 
public string name { get; set; } 

あなたのフィールドは、JSONに間違ったクラス構造を小数されていないようにあなたは、数十他の問題を抱えています。ここではどのようにあなたのクラスは次のようになります。

あなたが変換を行う方法
public class MyFeed 
    { 
     [JsonProperty(PropertyName = "@Provider")] 
     public string Provider { get; set; } 

     public MMM MMM { get; set; } 
    } 

    public class RootJsonObject 
    { 
     public MyFeed MyFeed { get; set; } 
    } 

    public class MMM 
    { 
     [JsonProperty(PropertyName = "@name")] 
     public string name { get; set; } 
     public string provider { get; set; } 
     public string low { get; set; } 
     public string high { get; set; } 
     public string change { get; set; } 
     public string pctchange { get; set; } 
     public string ask { get; set; } 
     public string bid_time { get; set; } 
     public string bid { get; set; } 
    } 

RootJsonObject quote = JsonConvert.DeserializeObject<RootJsonObject>(json); 
+1

"public Data Info {get; set;}"を忘れないでください。名前が "MMM"である必要があります。 –

+0

@PauloJuniorありがとうございました。 – mybirthname

+0

JSON自体をフォーマットするオプションがありません。サードパーティのベンダーが「現状のまま」提供しているので、私はそれと一緒に暮らす必要があります。 –

0

あなたの引用クラスがシリアライズ可能でなければなりません使用しようとしました。それにSerializable属性を追加するか、DataMembersでDataContract属性を追加します。

1
  • JsonPropertyを使用して、シリアル化された文字列の名前を指定します。
  • 対象のオブジェクトが含まれているオブジェクトを渡すのとは別の種類の引用符型を囲む必要があります。
  • DateTimeの型をシリアル化する方法を指定する必要があります。

ここでは、あなたのjsonで完全かつ実用的なソリューションです。

class JsonTester 
{ 
    public void Test() 
    { 
     const string json = "{\"MyFeed\":{\"@Provider\":\"SomeProvider\",\"MMM\":{\"@name\":\"3M Corp\",\"low\":\"194.80\",\"high\":\"136.78\",\"change\":\"2.80\",\"pctchange\":\"0.22\",\"ask\":\"135.15\",\"bid_time\":\"20161104131845\",\"bid\":\"134.80\"}}}"; 
     var settings = new JsonSerializerSettings() 
     { 
      DateFormatString = "yyyyMMddHHmmss" 
     }; 
     var quoteWrapper = JsonConvert.DeserializeObject<MyFeed>(json, settings); 
     var quote = quoteWrapper.Quote; 
    } 
} 

public class MyFeed 
{ 
    [JsonProperty("MyFeed")] 
    public Quote Quote { get; set; } 
} 

public class Quote 
{ 
    [JsonProperty("@Provider")] 
    public string Provider { get; set; } 
    [JsonProperty(PropertyName = "MMM")] 
    public Data Info { get; set; } 
} 

public class Data 
{ 
    [JsonProperty("@name")] 
    public string name { get; set; } 
    public decimal low { get; set; } 
    public decimal high { get; set; } 
    public decimal change { get; set; } 
    public decimal pctchange { get; set; } 
    public decimal ask { get; set; } 
    public DateTime bid_time { get; set; } 
    public decimal bid { get; set; } 
} 
+0

これはうまく動作し、日付が正しく解析されていることを確認するヒントがありがたいです。 –

+0

@DanielAnderson - これはあなたのためにうれしいです。 – Igor

関連する問題