2017-09-13 33 views
1

如何获取此代码并使其更具动态性?如何使方法动态加载键/值对?

现在我必须张贴JSON作为

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

理想我想后JSON,如:

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

所以基本上我绑在我的JSON使用键/值。
如何动态加载值而不必使用键/值?

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(); 
    } 
} 
+0

收到它作为一个字符串和反序列化到'动态'或'JObject'和解析在控制器上 – ASpirin

+0

只是好奇,为什么你需要这个?在任何情况下,你必须为每个控制器/动作制定一个特定的逻辑,但在这种情况下,你只是拒绝基本的数据验证,如果你使用stricktly类型的对象,你会得到数据验证和转换逻辑。 – ASpirin

回答

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

+0

我在这一行上得到一个无效的投射 JArray jsonArray = JsonConvert.DeserializeObject (json); – PrivateJoker

+0

@PrivateJoker我认为这是因为你正在使用'values:'而我正在使用''values“:'(带引号)。另外,我正在替换第一个'{'和最后一个'}'。也许回顾演示更清晰;) – Flxtr

0

FromBody与动态类型尝试。请参见下面的例子:

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

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

      // go on with myVar... 
     } 
0

我相信如果你声明它为List<IDictionary<string,string>> values,你会得到一个类似于你所期望的数据结构。你可以在哪里访问list[0]["FirstName"]或类似的地方。