C#Web API可以在包含字典的URI中反序列化对象

时间:2018-08-09 20:05:24

标签: c# asp.net-web-api2

我正在尝试在GET请求中传递复杂的对象。 C#模型对象如下所示:

@SpringBootTest
@ExtendWith(SpringExtension.class)
class ConverterContextTest {

    @Autowired
    private final ConverterContext converterContext;
    @Autowired
    private final ConverterRegisterUserDto created;

    @Autowired
    ConverterContextTest(ConverterContext converterContext, ConverterRegisterUserDto created) {
        this.converterContext = converterContext;
        this.created = created;
    }

    @Test
    void converterContextGivesCorrectConverter(){
        ConverterRegisterUserDto returned = converterContext.getConverter(ConverterRegisterUserDto.class);
        assertEquals(returned, created);
    }

    @Test
    void converterContextGivesIncorrectConverter(){
        ConverterShowUserDto returned = converterContext.getConverter(ConverterShowUserDto.class);
        assertNotEquals(returned, created);
    }
}

在Chrome浏览器中,我在“查询字符串参数”下看到以下内容:

public class GetRequest
{
    public string ID { get; set; }
    public List<string> RequestedFields { get; set; }
    public Dictionary<string, List<string>> RequestedGrids { get; set; }
}

我希望这样的请求可以正确反序列化为以下操作中的参数:

ID: 1
RequestedFields[]: someTxtField
RequestedFields[]: someOtherField
RequestedGrids[someGrid][]: keyColumn
RequestedGrids[someGrid][]: someDataColumn

但是,每当请求进入此操作时,该参数的RequestedGrids属性始终计数为0,而其他属性则填充良好。有办法使这项工作吗?

添加

进入JQuery $ .get调用的对象如下所示:

[HttpGet]
[ActionName("get")]
public Dictionary<string,object> GetStuff([FromUri] GetRequest get_req)

其中RequestedFields是纯字符串数组,而RequestedGrids是纯对象,其中每个对象属性值都是字符串数组。

3 个答案:

答案 0 :(得分:0)

当您需要发送大量数据(尤其是复杂数据)时,最好将数据作为POST请求正文的一部分发送。这样,您可以确保结构完全匹配,并且可以轻松地与JSON格式进行转换。

答案 1 :(得分:0)

输入在GET上是什么样的?字典类型通常很难进行反序列化-有关详细信息,请参见Deserialize JSON string to Dictionary<string,object> ...

答案 2 :(得分:0)

最简单的方法似乎是传递一个JSON查询字符串而不是使用自动绑定。所以动作看起来像这样:

[HttpGet]
[ActionName("get")]
public Dictionary<string, object> GetStuff(string get_str)
{
    var get_req = JsonConvert.DeserializeObject<GetRequest>(get_str);
    //Do ur stuff
}

JS看起来像这样:

$.get('<action path>', { get_str: JSON.stringify(get_obj) }, ...