如何使方法动态加载键/值对?

时间:2017-09-13 20:43:52

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

如何使用此代码并使其更具动态性?

现在我必须将JSON发布为

{ values: [{Key: 'MyKey', Value: 'MyValue'}] }

理想情况下,我想发布JSON,如:

    { values: [{Make: 'Car', Color: 'Red'}] }
OR
    { values: [{FirstName: 'George', LastName: 'Constanza'}] }

所以基本上我与我的JSON中使用Key / Value有关。
如何在不使用键/值的情况下动态加载值?

public class MyPerformerController : ApiController
{
    [HttpPut("update/{myPath}")]
    public Task<IActionResult> DoSomething(string myPath, [FromBody]MyCollection values)
    {
        foreach (var val in value)
        {
            var keyValue = val.Key;
            var someValue = val.Value;
        }
    }
}

public class MyCollection : IEnumerable<KeyValuePair<string,string>>
{ 
    public IEnumerable<KeyValuePair<string, string>> Values { get; set; }

    public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
    {
        return Values.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

3 个答案:

答案 0 :(得分:0)

尝试使用动态类型的FromBody。请参阅以下示例:

        [HttpPost]
        [Route("api/webs/")]
        public HttpResponseMessage RouteGetWebList([FromBody]dynamic values)
        {

            string myVar = (string)values["myJSONVariable"].Value;

             // go on with myVar...
        }

答案 1 :(得分:0)

如果你有这种结构:

[{FirstName: 'George', LastName: 'Constanza'}]

您可以使用JArray

转换为JsonConvert.DeserializeObject<JArray>(json);

例如,有这个json:

[
    {
        FirstName: "George",
        LastName: "Constanza"
    }, {
        FirstName: "Mike",
        LastName: "Passant"
    }, {
        FirstName: "John",
        LastName: "Connor"
    }
]

您可以迭代并获取KeyValue

JArray jsonArray = JsonConvert.DeserializeObject<JArray>(json);

foreach (JObject item in jsonArray.Children<JObject>())
{
    foreach (JProperty element in item.Properties())
    {
        Console.WriteLine(string.Format("Key: {0}", element.Name));
        Console.WriteLine(string.Format("Value: {0}", element.Value.ToString()));
    }
}

在这里,您可以看到 Demo

答案 2 :(得分:0)

我相信如果您将其声明为List<IDictionary<string,string>> values,您将获得与您想要的数据结构相似的数据结构。你可以访问list[0]["FirstName"]或类似的地方。