C# 如何将JSON数据接收到Web API ApicController方法中?
我正在编写一个Web API ApiController,其中包含几个接收JSON数据的PUT方法。JSON不是确定性的,因此不能硬映射到自定义C#对象,但需要作为字典/序列(映射/列表)接收 我曾尝试在控制器中使用IDictionary作为PUT方法的数据parm,这种方法很有效——数据似乎是从JSON映射到字典的。但是,有必要将字典声明为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
,并且没有明确的方法来检索对象值作为其适当的类型。(在我的搜索中,我发现了一些建议的问题,但它们正是如此。)
还有一个System.Json.JsonObject类型,我最终设法通过NuGet加载了它,但当我使用它时,系统似乎不知道如何映射数据
这通常是如何做到的?如何实现接收通用JSON的ApiController方法
我可以看到三种基本方法:
(我应该补充一点,我是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中如何工作。