如何将这个json转换为C#对象

时间:2017-09-19 05:58:55

标签: javascript c# json

我从第三方收到这个JSON,因此无法控制它,

{
    code: 200,
    message: success,
    data: {
        categories: {
            0: {
                prop1: 100,
                prop2: blah
            },
            1: {
                prop1: 100,
                prop2: blah
            }
                    // etc.. etc.. it may return around 100 or more categories or less
        }
    }
}

现在我正在尝试将其转换为C#对象,

[DataContract]
public class Category
{
    [DataMember] public string prop1 { get; set; }
    [DataMember] public string prop2 { get; set; }
}

[DataContract]
public class Data
{
    [DataMember]
    public List<Category> categories { get; set; }
}

[DataContract]
public class RootObject
{
    [DataMember]
    public int code { get; set; }
    [DataMember]
    public string message { get; set; }
    [DataMember]
    public Data data { get; set; }
}

和转换它的代码,

   var response = LoadPageAsync(url).Result;
   var serializer = new JavaScriptSerializer();
   var rootObject = serializer.Deserialize<RootObject>(response);

问题是,即使JSON中有很多,它也会让类别计数为零。

5 个答案:

答案 0 :(得分:5)

您需要将类别列表更改为字典。测试了以下代码,并根据需要实现了反序列化。值得注意的是,你的json实际上无效没有字符串周围的引号。我也使用过JSON.Net,但这应该是无关紧要的。

[DataContract]
public class Category
{
    [DataMember] public string prop1 { get; set; }
    [DataMember] public string prop2 { get; set; }
}

[DataContract]
public class Data
{
    [DataMember]
    public Dictionary<int, Category> categories { get; set; }
}

[DataContract]
public class RootObject
{
    [DataMember]
    public int code { get; set; }
    [DataMember]
    public string message { get; set; }
    [DataMember]
    public Data data { get; set; }
}

static void Main(string[] args)
{
    var root = new RootObject()
    {
        code = 1,
        message = "test",
        data = new Data()
        {
            categories = new Dictionary<int, Category>()
            {
                { 0, new Category()
                    {
                        prop1 = "cat1prop1",
                        prop2 = "cat1prop2"
                    }
                },
                { 1,  new Category()
                    {
                        prop1 = "cat2prop1",
                        prop2 = "cat2prop2"
                    }
                }
            }
        }
    };
    var testJson = "{code: 200,message: \"success\",data: {categories: {0: {prop1: 100,prop2: \"blah\"},1: {prop1: 100,prop2: \"blah\"}}}}";
    var json = JsonConvert.SerializeObject(root);
    var testConvert = JsonConvert.DeserializeObject<RootObject>(testJson);
}

答案 1 :(得分:0)

使用Json.NET

将Json反序列化为对象变得如此简单:

string json = @"{
  'Email': 'james@example.com',
  'Active': true,
  'CreatedDate': '2013-01-20T00:00:00Z',
  'Roles': [
    'User',
    'Admin'
  ]
}";

Account account = JsonConvert.DeserializeObject<Account>(json);

Console.WriteLine(account.Email);
// james@example.com

正如他们自己docs所示。

Json.NET会将任何Json转换为对象,只要您在代码中定义它即可。在这种情况下,Account可以是任何内容,RootObject。如果Json的某些内容不符合标准,它也可能会返回一些有用的例外。

答案 2 :(得分:0)

json无效,字符串需要包含在"中。

您可以在此处测试json

https://jsonlint.com/

这是有效的:

{
    "code": 200,
    "message": "success",
    "data": {
        "categories": {
            "0": {
                "prop1": 100,
                "prop2": "blah"
            },
            "1": {
                "prop1": 100,
                "prop2": "blah"
            }
        }
    }
}

型号:

public class Zero
    {

        [JsonProperty("prop1")]
        public int Prop1 { get; set; }

        [JsonProperty("prop2")]
        public string Prop2 { get; set; }
    }

    public class One
    {

        [JsonProperty("prop1")]
        public int Prop1 { get; set; }

        [JsonProperty("prop2")]
        public string Prop2 { get; set; }
    }

    public class Categories
    {

        [JsonProperty("0")]
        public Zero Zero { get; set; }

        [JsonProperty("1")]
        public One One { get; set; }
    }

    public class Data
    {

        [JsonProperty("categories")]
        public Categories Categories { get; set; }
    }

    public class Example
    {

        [JsonProperty("code")]
        public int Code { get; set; }

        [JsonProperty("message")]
        public string Message { get; set; }

        [JsonProperty("data")]
        public Data Data { get; set; }
    }

使用Newtonsoft Json:

var example = Newtonsoft.Json.JsonConvert.DeserializeObject<Example>(json);

答案 3 :(得分:0)

在这里你可以找到很多方法来做你想要的,我个人喜欢JavaScriptJsonSerializer。 enter link description here

使用JavaScriptJsonSerializer

JavaScriptSerializer是一个有助于序列化和反序列化JSON的类。它存在于命名空间System.Web.Script.Serialization中,该命令在程序集System.Web.Extensions.dll中可用。要将.Net对象序列化为JSON字符串,请使用Serialize方法。可以使用Deserialize或DeserializeObject方法将JSON字符串反序列化为.Net对象。让我们看看如何使用JavaScriptSerializer实现序列化和反序列化。

以下代码段是声明BlogSites类型的自定义类。

class BlogSites  
{  
    public string Name { get; set; }  
    public string Description { get; set; }  
}  

<强>序列化

在Serialization中,它将自定义.Net对象转换为JSON字符串。在以下代码中,它创建了一个BlogSiteclass实例,并为其属性分配了一些值。然后我们创建一个JavaScriptSerializer实例并通过传递object(BlogSites)来调用Serialize()方法。它以字符串格式返回JSON数据。

// Creating BlogSites object  
BlogSites bsObj = new BlogSites()  
{  
   Name = "C-sharpcorner",  
   Description = "Share Knowledge"  
};  



// Serializing object to json data  
JavaScriptSerializer js = new JavaScriptSerializer();  
string jsonData = js.Serialize(bsObj); // {"Name":"C-sharpcorner","Description":"Share Knowledge"} 

<强>反序列化

在反序列化中,它与序列化相反,这意味着它将JSON字符串转换为自定义.Net对象。在以下代码中,它创建JavaScriptSerializer实例并通过传递JSON数据调用Deserialize()。它从JSON数据返回自定义对象(BlogSites)。

// Deserializing json data to object  
JavaScriptSerializer js = new JavaScriptSerializer();  
BlogSites blogObject = js.Deserialize<BlogSites>(jsonData);  
string name = blogObject.Name;  
string description = blogObject.Description;




// Other way to whithout help of BlogSites class  
dynamic blogObject = js.Deserialize<dynamic>(jsonData);  
string name = blogObject["Name"];  
string description = blogObject["Description"];  

答案 4 :(得分:0)

使用Json.NET

public class Category
{
    public string prop1;
    public string prop2;
}

public class Data
{
    public List<Category> categories;
}

public class RootObject
{
    public int code;
    public string message;
    public Data data;
}

删除DataContract代码以创建简单的类结构。

使用JSON.Net反序列化对象

RootObject data = JsonConvert.DeserializeObject<RootObject>(jsonString);

RootObject是您的顶级对象。

然后您应该像任何普通对象一样访问它,即

string firstProp1 = RootObject.data.categories[0].prop1