2015-04-02 85 views
0

我有JSON对象,这样的事情,并且其动态,jsonInput =如何获得动态对象属性的列表,在C#中

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

我将其转换成使用Newtonsoft .NET动态对象。 Json转换器:

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 2015-04-02 21:15:05

+0

这里不需要使用'dynamic'。它是一个'JObject',你可以使用它大部分就像字典。看看它的文档。 – 2015-04-02 22:32:19

回答

-2

你应该反序列化到一个字典,然后你可以遍历键来获得属性名称

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

您可以访问values.Keys获得的属性名称即可。

+0

我需要将它反序列化为一个对象,因为我必须将该对象沿着管道传递给WCF服务。所以它必须是动态的,而不是通用的T.但是,也许你是对的,为了获得它的属性,我可以做到这一点(如果它的作品) – monstro 2015-04-02 23:14:39

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 2015-04-02 23:12:21

+0

@Donwvoter我将不胜感激如果你能指出这个答案是错的。如果完全错误,我会将其移除。否则,我会纠正我的错误。先谢谢你。 – Christos 2016-06-15 19:07:41

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 2015-04-02 23:17:29