我要反序列化这个JSON:
{
"Home1": [
{
"name": "Hans",
"age": 20
},
{...}
],
"Home2": [
{...},
{...}
]
}
转化为List<House>
使用这些类:
class Person {
public string Name { get; set; }
public int Age { get; set; }
}
class House : List<Person> {
public string Name { get; set; }
}
我怎么能告诉Newtonsoft JSON,House.Name
应该为关键(Home1
)?
PS:类结构不固定,但我需要房子的名字是一个类的属性。
在继承列表和类结构的想法背后留下理性,您当然可以创建自定义转换器,但我认为更容易的选择是将json反序列化为Dictionary<string, House>
(可以代表您的json结构),然后手动映射名称:
var result = JsonConvert.DeserializeObject<Dictionary<string, House>>(json);
foreach (var kvp in result)
{
kvp.Value.Name = kvp.Key;
}
var houses = result.Values;
try this
var deserializedJson = JsonConvert.DeserializeObject<Dictionary<string, List<Person>>>(json);
var houses=new List<House>();
foreach (var element in deserializedJson)
{
houses.Add(new House { Name = element.Key, Persons = element.Value} );
}
var result=JsonConvert.SerializeObject(houses);
}
结果
[
{
"Name": "Home1",
"Persons": [
{
"Name": "Hans",
"Age": 20
}
]
},
{
"Name": "Home2",
"Persons": [
{
"Name": "John",
"Age": 22
}
]
}
]
类
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class House
{
public string Name { get; set; }
public List<Person> Persons {get; set;}
}
Json解析/反序列化不是这样工作的。
你必须有与json相同结构的类。
你的源json是具有Home1, Home2等属性的对象
但是你直接期望它转换成另一个结构
我建议首先将Real object中的json转换为json的结构。然后循环遍历属性并在List中填充loop。
你能解释一下这个类应该做什么吗?
class House : List<Person> { public string Name { get; set; } }
对我来说没有任何意义。
根据您的要求给出答案,
我们在反序列化和REGEX之前清理JSON字符串怎么样?
string json = @"{
""Home1"": [
{
""name"": ""Hans"",
""age"": 20
},
{
""name"": ""Hans"",
""age"": 20
},
],
""Home2"": [
{
""name"": ""Hans"",
""age"": 20
},
{
""name"": ""Hans"",
""age"": 20
},
]
}";
/*Replaces all Home + Digit combination to Home*/
json = Regex.Replace(json, @"Homed*", "Home");
/* Output
{
"Home": [
{
"name": "Hans",
"age": 20
},
{
"name": "Hans",
"age": 20
},
],
"Home": [
{
"name": "Hans",
"age": 20
},
{
"name": "Hans",
"age": 20
},
]
}
*/