Json嵌套对象反序列化

时间:2019-04-08 10:48:49

标签: c# json json.net

我想根据消耗的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': [],
    }
}

如何反序列化嵌套对象?

3 个答案:

答案 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的文件,每次仅加载和解析一行。

相关问题