我想根据消耗的Json动态创建c#对象。我不在乎这个json,只是想挑选我需要的属性。
我不知道使用动态关键字是否是最佳实践,并且基于创建的对象,我是否可以创建一个全新的json结构。
如何对嵌套对象进行反空间化。示例json:
{
'name': 'James',
'Profile': {
'body': {
'id': 'Employee1',
'type': 'Employee',
'attributes': {
props...
},
'job': {
props..
},
'team': [],
},
}
这是一个简单的尝试。
var test = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(test.ToString());
我可以创建对象列表,但是当我开始使用父/子对象时,似乎无法正常工作。
以下JSON可以很好地用作输出:
'body': {
'id': 'Employee1',
'type': 'Employee',
'attributes': {
props...
},
'job': {
props..
},
'team': [],
}
所需的输出
{
'name': 'James',
'Profile': {
'body': {
'id': 'Employee1',
'type': 'Employee',
'attributes': {
props...
},
'job': {
props..
},
'team': [],
},
'Profile': {
'body': {
'id': 'Employee2',
'type': 'Employee',
'attributes': {
props...
},
'job': {
props..
},
'team': [],
}
}
如何反序列化嵌套对象?
答案 0 :(得分:0)
您可以在以下代码行中使用json类
// Review Model
public function deleteRelatedData() {
// Delete all votes of this review
$this->votes()->delete();
// Calling the same method to all of the child of this review
$this->replies->each->deleteRelatedData();
}
// Controller
public function deletereview($id=null){
$review = Review::find($id);
$review->deleteRelatedData();
return back();
}
答案 1 :(得分:0)
您可以使用JsonConvert
:
dynamic myNewObject = JsonConvert.DeserializeObject(json);
然后,您可以像这样访问json属性:
myNewObject.Profile.body.id
答案 2 :(得分:0)
无复制。该字符串已反序列化。 test
包含整个图形。只要使用有效的JSON字符串,就会产生预期的输出:
此代码段:
var json=@"{
'name': 'James',
'Profile': {
'body': {
'id': 'Employee1',
'type': 'Employee',
'attributes': {
'a':3
},
'job': {
'a':3
},
'team': [],
},
}";
var x=JsonConvert.DeserializeObject<object>(json);
Console.WriteLiine(x.ToString());
产生:
{
"name": "James",
"Profile": {
"body": {
"id": "Employee1",
"type": "Employee",
"attributes": {
"a": 3
},
"job": {
"a": 3
},
"team": []
}
}
}
不过,从注释来看,看起来 actual JSON字符串不是有效的JSON字符串,并引发了异常:
我得到Newtonsoft.Json.JsonReaderException:'在完成读取JSON内容后遇到的其他文本:,。路径”,第21行,位置13。'
此错误指向导致问题的JSON字符串中的实际位置。也许那里还有一个额外的角色?也许文本包含多个 JSON字符串而不是一个?以下字符串是 not 无效的JSON-JSON 不能具有多个根对象:
{ "a":"b"}
{ "c":"d"}
日志记录工具,事件处理和分析软件通过这种方式在每个文件中存储多个JSON字符串,因为它只需要执行append
操作,不需要解析整个文本即可产生结果并使分区更加容易。仍然是无效的JSON,尽管必须一次读取和处理一行。
您发现许多人将其描述为“流JSON”,恰恰是因为您可以以流方式处理数据。您不必一次加载和解析100MB事件文件,而可以一次加载和处理一行,例如:
IEnumerable<string> lines=File.ReadLines(pathToBigFile);
foreach(var line in lines)
{
var myObject=JsonConvert.DeserializeObject<someType>(line);
//do something with that object
}
File.ReadLines
返回一个IEnumerable<string>
,每次迭代仅加载一行。而不是加载整个100MB的文件,每次仅加载和解析一行。