猿问

为什么我的 .NET Rest API 返回带有额外子属性的列表而不是 [..]?

我想知道原因有一段时间了:


public List<int> getTest(){

   List<int> test = new List<int>();

   test.add(1);

   return test;

}

返回客户端为:


{

   test: {

            $id: randomnumber,

            $values: [1]

         }

}

代替


{

   test: [1]

}


我使用 .NET Framework 4.6.1 并像上面的代码一样初始化列表。通常这不是问题,因为在客户端,您可以像测试一样轻松地访问 $values。但我无法释怀,为什么它会这样返回。并希望有人能给我一个令人宽慰的答案,说明为什么以及是否可以在没有额外子属性 $values 和 $id 的情况下返回。


该函数在控制器类中从实现类中调用。


        [HttpGet, Route("getTest")]

        public List<int> getTest()

        {

            return implementationClass.getTest();

        }


慕尼黑5688855
浏览 125回答 3
3回答

一只甜甜圈

由于您已将 JSON 序列化设置配置为使用PreserveReferencesHandling.all,因此您的输出与您的预期有很大不同。例如:var list = new List<int> { 1, 2, 3 };var json1 = JsonConvert.SerializeObject(list);var json2 = JsonConvert.SerializeObject(list,&nbsp;&nbsp; &nbsp; new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All });将为您提供 JSON 输出的以下 2 种变体:[1,2,3]{"$id":"1","$values":[1,2,3]}因此,您可以删除配置,或者,如果您专门想为此方法更改它,则必须手动进行转换,例如:public string getTest(){&nbsp; &nbsp;List<int> test = new List<int>();&nbsp; &nbsp;test.add(1);&nbsp; &nbsp;return JsonConvert.SerializeObject(test);}

当年话下

在 DotNet 中,您将始终获得复杂类型的元数据属性。要清理 Json 结果,请添加 json 忽略属性,例如:options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles

呼唤远方

用这个。&nbsp; &nbsp; [HttpGet, Route("getTest")]&nbsp; &nbsp; public IHttpActionResult Get ()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp;return Ok(implementationClass.getTest());&nbsp; // Returns an OkNegotiatedContentResult&nbsp; &nbsp; }
随时随地看视频慕课网APP
我要回答