Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将JSON数据接收到Web API ApicController方法中?_C#_Json_Asp.net Web Api_Asp.net Apicontroller - Fatal编程技术网

C# 如何将JSON数据接收到Web API ApicController方法中?

C# 如何将JSON数据接收到Web API ApicController方法中?,c#,json,asp.net-web-api,asp.net-apicontroller,C#,Json,Asp.net Web Api,Asp.net Apicontroller,我正在编写一个Web API ApiController,其中包含几个接收JSON数据的PUT方法。JSON不是确定性的,因此不能硬映射到自定义C#对象,但需要作为字典/序列(映射/列表)接收 我曾尝试在控制器中使用IDictionary作为PUT方法的数据parm,这种方法很有效——数据似乎是从JSON映射到字典的。但是,有必要将字典声明为,并且没有明确的方法来检索对象值作为其适当的类型。(在我的搜索中,我发现了一些建议的问题,但它们正是如此。) 还有一个System.Json.JsonObj

我正在编写一个Web API ApiController,其中包含几个接收JSON数据的PUT方法。JSON不是确定性的,因此不能硬映射到自定义C#对象,但需要作为字典/序列(映射/列表)接收

我曾尝试在控制器中使用IDictionary作为PUT方法的数据parm,这种方法很有效——数据似乎是从JSON映射到字典的。但是,有必要将字典声明为
,并且没有明确的方法来检索对象值作为其适当的类型。(在我的搜索中,我发现了一些建议的问题,但它们正是如此。)

还有一个System.Json.JsonObject类型,我最终设法通过NuGet加载了它,但当我使用它时,系统似乎不知道如何映射数据

这通常是如何做到的?如何实现接收通用JSON的ApiController方法

我可以看到三种基本方法:

  • 以某种方式使字典/序列与对象或类似对象一起工作
  • 让类似System.Json.JsonObject的东西工作,也许可以通过滑动路由信息
  • 将JSON作为字节数组接收,然后使用可用的C#JSON工具包之一显式解析
  • (关于数据的动态性,JSON对象可能缺少条目或无关条目,在某些情况下,特定条目可能表示为单个JSON值或JSON值数组。(其中“值”是JSON数组、对象、字符串、数字、布尔值或空值。)通常,除了数组/非数组歧义外,键和值类型之间的关系是已知的。)

    (但我应该注意,这是一个大型项目,我将从其他作者的几个其他组件接收JSON字符串。能够检查接收到的类型并断言它如预期的那样是非常有用的,甚至从安全角度来看可能是必要的。)


    (我应该补充一点,我是C#方面的新手,只使用了大约6个月。)

    你必须知道你想要什么样的数据,但我在过去使用动态键入成功地做到了这一点

    大概是这样的:

        [Test]
        public void JsonTester()
        {
            string json = "{ 'fruit':'banana', 'color':'yellow' }";
    
            dynamic data = JsonConvert.DeserializeObject(json);
    
            string fruit = data["fruit"];
            string color = data["color"];
    
            Assert.That(fruit == "banana");
            Assert.That(color == "yellow");
        }
    

    编辑:
    您需要事先知道要反序列化到的类型,在这种情况下,您可以立即将其反序列化到该类型。
    或者,您可以将其反序列化为
    动态
    类型,然后在知道要对其执行什么操作后将其转换为静态类型

    using Newtonsoft.Json;
    using NUnit.Framework;
    
    public class DTO
    {
        public string Field1;
        public int Field2;
    }
    
    public class JsonDeserializationTests
    {
        [Test]
        public void JsonCanBeDeserializedToDTO()
        {
            string json = "{ 'Field1':'some text', 'Field2':45 }";
    
            var data = JsonConvert.DeserializeObject<DTO>(json);
    
            Assert.That(data.Field1 == "some text");
            Assert.That(data.Field2 == 45);
        }
    
        [Test]
        public void JsonCanBeDeserializedToDynamic_AndConvertedToDTO()
        {
            string json = "{ 'Field1':'some text', 'Field2':45 }";
    
            var dynamicData = JsonConvert.DeserializeObject<dynamic>(json);
            var data = new DTO { Field1 = dynamicData["Field1"], Field2 = dynamicData["Field2"] };
    
            Assert.That(data.Field1 == "some text");
            Assert.That(data.Field2 == 45);
        }
    }
    
    使用Newtonsoft.Json;
    使用NUnit.Framework;
    公共类DTO
    {
    公共字符串字段1;
    公共国际领域2;
    }
    公共类JsonDeserializationTests
    {
    [测试]
    public void JsonCanBeDeserializedToDTO()
    {
    字符串json=“{'Field1':'some text','Field2':45}”;
    var data=JsonConvert.DeserializeObject(json);
    Assert.That(data.Field1==“一些文本”);
    断言(data.Field2==45);
    }
    [测试]
    public void jsonceanizedToDynamic_和convertedTodTo()
    {
    字符串json=“{'Field1':'some text','Field2':45}”;
    var dynamicATA=JsonConvert.DeserializeObject(json);
    var data=new DTO{Field1=dynamicata[“Field1”],Field2=dynamicata[“Field2”]};
    Assert.That(data.Field1==“一些文本”);
    断言(data.Field2==45);
    }
    }
    
    问题需要更具体,“这通常是如何做到的?”风格的问题通常会被认为过于宽泛和/或基于观点。您收到的JSON是如何动态的?你提前知道它可能包含哪些字段吗?嗯,我本来打算为此提供一笔可观的赏金,但我想我不会这么做。我已经很好地解决了这个问题。可惜没人想知道我发现了什么。@HotLicks,问题已经重新打开,请随意添加您发现的内容。那么如何进行动态键入呢?我发现的例子只是对象kluges的变体?不清楚在ApicController上下文中框架执行反序列化时,这将如何工作。仍然不清楚这在ApicController中如何工作。