我从第三方收到这个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中有很多,它也会让类别计数为零。
答案 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反序列化为对象变得如此简单:
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
:
这是有效的:
{
"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