2017-08-09 80 views
-3

我想此JSON发送到服务器:发送完整的JSON用asp.net MVC

{ 
    "id":123, 
    "person": {"name":"john", "surname":"john"}, 
    "qualities": ["gentle", "handsome"], 
    "friends": [{"name":"sam", "surname":"gamgee"}, {"name":"donald", "surname":"trump"}] 
} 

因此,所有可能的情况下(正常场,JSON场,场列表和JSON列表字段一个相当完整的JSON )。

我想在我的asp.net mvc服务器上发布这种对象。我发布HTTP头“内容:应用程序/ JSON”,我不想改变。

我尝试了很多东西,但最后总是遇到问题,特别是当我有一个json列表字段时。 为什么这种事情不起作用?

[HttpPost] 
public ActionResult SendJson(dynamic json) { 
    json.friends[0].name --> error 
} 

当我发送{"json": {#json above#} }

+0

你可以试试json.json.friends [0] .name?好奇,如果它只是一个关于如何将JSON作为另一个json中的对象传递的问题。 –

+0

不工作。其实不包围它的“json”字段不起作用,因为asp.net似乎直接解析发送的json,因此参数是json字段。 – fazega

+0

json.json.friends [0] .name - 作品,有什么麻烦吗? – Immanuel

回答

0

使用混凝土类型。

public class Person { 
    public string name { get; set; } 
    public string surname { get; set; } 
} 

public class Friend { 
    public string name { get; set; } 
    public string surname { get; set; } 
} 

public class DataModel { 
    public int id { get; set; } 
    public Person person { get; set; } 
    public IList<string> qualities { get; set; } 
    public IList<Friend> friends { get; set; } 
} 

更新控制器以期待强类型。

[HttpPost] 
public ActionResult SendJson([FromBody] DataModel model) { 
    var name = model.friends[0].name; 
} 

最后发送时,发送所述第一片段为是

{ 
    "id":123, 
    "person": {"name":"john", "surname":"john"}, 
    "qualities": ["gentle", "handsome"], 
    "friends": [{"name":"sam", "surname":"gamgee"}, {"name":"donald", "surname":"trump"}] 
} 

不包裹在另一个对象。否则,你就需要一个额外的对象

public class RootObject { 
    public DataModel json { get; set; } 
} 

符合此{"json": {#json above#} }

+0

我很确定它的工作原理。但是你一定明白,我无法为我的所有请求创建数百个模型...... – fazega

+0

@fazega最终它会让你受益。创建数百个模型然后必须为每个模型解决问题更快。您可以使用像automapper这样的工具来映射这些字段,尽管我从未使用它。 –

0

工作得很好..截图包含邮递员& .NET监视窗口..

enter image description here

+0

fazega发送{“json”:{#json above#}}不是{#json以上#} –

+0

json.json.friends [0] .name - 作品,有什么麻烦吗? – Immanuel

+0

你使用什么标题? – fazega

0

MVC不能做自己解析动态参数,您必须创建自己的ModelBinder来捕获输入的数据流并自己创建动态对象。

参见方法here

+0

“MVC现在无法做到这一点”并不完全清楚您的意思。我们不应该依赖链接来理解你的意思。你的答案应该站在自己的优点,链接应该用来补充你的问题。它们不应该是理解它的关键。 – mason

+0

现在好点了吗?我没有开发,因为它回答了我的问题:它不可能自动执行我想要的,你必须创建自己的粘合剂... – fazega

+0

有点。我修正了你的语法:MVC不是男性或女性的对象,因此不是“他”或“她”,而是“它”。另外,你应该清楚你的意思是“那个”。我编辑了你的答案来纠正这些问题。 – mason