2015-04-02 2 views
0

У меня есть JSON объект, что-то вроде этого, и его динамика, jsonInput =Как получить список динамических свойств объектов в C#

{ 
    "CONTRATE":80, 
    "SALINC":30, 
    "RETAGE":67, 
    "MARSTATUS":"single", 
    "SPOUSEDOB":"1970-01-01", 
    "VIEWOPTION":"pension" 
} 

Я преобразовать его в .NET динамического объекта с помощью Newtonsoft. Json converter:

var jsonDynamic = JsonConvert.DeserializeObject<dynamic>(jsonInput); 

Теперь у меня есть динамический объект jsonDynamic .NET.

Как я могу получить его свойства сейчас? Это должно быть jsonDynamic.CONTRATE, jsonDynamic.SALINC и т. Д.

Как я могу получить имена этих свойств из jsonDynamic?

Спасибо.

+0

Я лично использовал метод WrapObject от здесь, чтобы быть в состоянии делать то, что вы описываете. Он является внутренним, поэтому я не мог получить к нему доступ напрямую. https://github.com/jbogard/aspnetwebstack/blob/master/src/System.Web.Helpers/Json.cs – jones6

+0

Здесь вам не нужно использовать 'dynamic'. Это «JObject», и вы можете использовать его в основном как словарь. Посмотрите на документацию. –

ответ

-2

Вы должны десериализации в словарь, а затем вы можете перебрать ключи, чтобы получить имена свойств

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonInput); 

Вы можете получить доступ к values.Keys, чтобы получить имена свойств тогда.

+0

Мне нужно десериализовать его в объект, так как я должен передать этот объект по трубопроводу в службу WCF. Таким образом, он должен быть динамическим, но не универсальным T. но, возможно, u'r right, с целью получения его свойств, я мог бы, вероятно, сделать это (если он работает) – monstro

0

Вы могли бы создать класс, который будет представлять JSON десериализации, как показано ниже:

public class ClassName 
{ 
    public int Contrate { get; set; } 
    public int Salinc { get; set; } 
    // Here you will place the rest of your properties. 
} 

, а затем просто использовать это:

var jsonDynamic = JsonConvert.DeserializeObject<ClassName>(jsonInput); 

Таким образом, вы будете избегать использования динамический объект.

+0

То есть точка) Я не могу. Структура объекта JSON генерируется во время выполнения, его неизвестность. – monstro

+0

@Donwvoter Я был бы признателен Если бы вы могли указать на неверность этого ответа. Если это совершенно неправильно, я удалю его. В противном случае, я исправлю свою ошибку. Заранее спасибо. – Christos

0
var jobj = JObject.Parse(jsonInput); 
dynamic jsonDynamic = jobj; 

var dict = jobj.Children() 
       .OfType<JProperty>() 
       .ToDictionary(x => x.Name, x => x.Value); 

int c = (int)dict["CONTRATE"]; 

или если вы хотите только имена свойств

var propNames = jobj.Children() 
        .OfType<JProperty>() 
        .Select(x => x.Name) 
        .ToList(); 
+0

Спасибо, я использовал JSON.NET только для базового преобразования, но это должно сделать трюк – monstro

Смежные вопросы