Netwonsoft JSON序列化与指定的条目列表



我要反序列化这个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
},
]
}
*/

最新更新