2016-11-04 4 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); 
     } 
    } 

Я прошел через код, так что я знаю запрос на веб-работает и возвращает строку 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

Не забывайте о «общедоступной информации о данных {get; set;}", похоже, что ее имя должно быть "MMM". –

+0

@PauloJunior Спасибо, я пропустил этот – mybirthname

+0

Я не получаю возможность форматировать сам JSON. Это происходит от стороннего поставщика «как есть», поэтому мне нужно жить с ним. –

0

Ваш ЦЕНУ класс должен быть Serializable. Или добавьте к нему атрибут Serializable или атрибут DataContract с DataMembers.

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