Json将具有动态属性

时间:2017-06-22 10:15:01

标签: c# json json.net

我正在尝试将一串JSON数据转换为C#类对象。但是我遇到了JSON的一小部分问题,它本质上是动态的。

JSON的部分如下:

"contact": [{
    "comment": null,
    "type": {
        "id": "cell",
        "name": "Example name"
    },
    "preferred": true,
    "value": {
        "country": "7",
        "formatted": "+7 (702) 344-3423-3",
        "number": "3498908",
        "city": "702"
    }
},
{
    "type": {
        "id": "email",
        "name": "Email example"
    },
    "preferred": false,
    "value": "name@mail.com"
}]

C#班

public class Value
{
    public string country { get; set; }
    public string formatted { get; set; }
    public string number { get; set; }
    public string city { get; set; }
}

public class Type
{
    public string id { get; set; }
    public string name { get; set; }
}

public class Contact
{
    public string comment { get; set; }
    public Type type { get; set; }
    public bool preferred { get; set; }
    public string value { get; set; }
}

C#代码

 Contact contact = JsonConvert.DeserializeObject<Contact>(result);

“值”的格式根据联系信息而变化。是否可以将值映射为字符串和类值。

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

你可以简单地使用dynamic,即

public dynamic value { get; set; }

如果它看起来像一个对象,它将被实现为JObject,可以通过dynamic API使用,因此.value.country将起作用,等等。如果它看起来像整数,bool或字符串:它将如此具体化。阵列也将适当处理。所以:你可以检查是否.value is string等。请注意,这不会使用你的Value类型,这样做会更复杂,但是:meh;你得到了数据。您可以随时手动将其切换出来。

如果您使用object而不是dynamic,它的行为也会如此,但是访问内部属性会更难。

答案 1 :(得分:0)

尝试

Contact contact = JsonConvert.DeserializeObject<Contact>(result[0]);

正如您在JSON中看到的,它是

"contact": [

表示一个数组,目前你只是传递整个数组

答案 2 :(得分:0)

除非您确定JSON始终具有相同的结构,否则最好使用dynamic变量而不是deserialize将其添加到类中。

如果您希望使用课程,则可以使用runtimereflection上自行构建自己的课程。但这就像用大炮杀死苍蝇并且你可能不会需要它,所以只需使用dynamic变量,它就是&#39 ;最好使用JSON字符串。