Netwonsoft JSON 反序列化为具有命名条目的列表
Netwonsoft JSON deserialize into List with named entries
我想反序列化这个 JSON:
{
"Home1": [
{
"name": "Hans",
"age": 20
},
{...}
],
"Home2": [
{...},
{...}
]
}
变成 List<House>
这些 classes:
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:class结构不固定,但是我需要房子的名字是class中的属性。
Json parsing/deserialization 这样不行。
您必须具有与 json 相同结构的 class。
您的来源 json 是具有 属性 Home1、Home2 等的对象
但你直接期望它转换成另一种结构。
建议先将Real object中的json转换为json的结构。然后遍历 属性 并用 List.
中的循环填充它
也请你解释一下这个 class 应该做什么。
class House : List<Person> { public string Name { get; set; } }
对我来说这没有任何意义。
抛开继承列表和您的 class 结构的想法,您当然可以创建 custom converter 但我认为更简单的选择是将 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;
试试这个
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;}
}
根据您的要求回答,
我们如何在反序列化和使用 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, @"Home\d*", "Home");
/* Output
{
"Home": [
{
"name": "Hans",
"age": 20
},
{
"name": "Hans",
"age": 20
},
],
"Home": [
{
"name": "Hans",
"age": 20
},
{
"name": "Hans",
"age": 20
},
]
}
*/
我想反序列化这个 JSON:
{
"Home1": [
{
"name": "Hans",
"age": 20
},
{...}
],
"Home2": [
{...},
{...}
]
}
变成 List<House>
这些 classes:
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:class结构不固定,但是我需要房子的名字是class中的属性。
Json parsing/deserialization 这样不行。
您必须具有与 json 相同结构的 class。
您的来源 json 是具有 属性 Home1、Home2 等的对象
但你直接期望它转换成另一种结构。
建议先将Real object中的json转换为json的结构。然后遍历 属性 并用 List.
中的循环填充它也请你解释一下这个 class 应该做什么。
class House : List<Person> { public string Name { get; set; } }
对我来说这没有任何意义。
抛开继承列表和您的 class 结构的想法,您当然可以创建 custom converter 但我认为更简单的选择是将 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;
试试这个
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;}
}
根据您的要求回答,
我们如何在反序列化和使用 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, @"Home\d*", "Home");
/* Output
{
"Home": [
{
"name": "Hans",
"age": 20
},
{
"name": "Hans",
"age": 20
},
],
"Home": [
{
"name": "Hans",
"age": 20
},
{
"name": "Hans",
"age": 20
},
]
}
*/