C#WebAPI用额外的大括号解析Json数据

时间:2018-03-09 14:10:11

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

这可能是一种非常罕见的情况,但我最终遇到了问题而没有找到任何解决方案。

我在C#中使用MVC WebAPI编写了一个WebAPI控制器。我有一个post方法接收自定义对象。

[HttpPost]
public HttpResponseMessage SendEmail([FromBody]Email email)
{

}

以下是电子邮件类,请注意,EmailData属于dynamic类型。

public class Email
{
    public string EmailTo { get; set; }

    public dynamic EmailData { get; set; }
}

当我发送JSON个有效负载作为帖子时,EmailData属性会在对象中添加额外的花括号“{}”。这给了我一个问题,因为我的动态数据无法使用额外的大括号“{}”来解析JSON

{
  "EmailFrom": "abc.xyz@abc.com",
  "EmailData": {
    "FirstName": "Rushi",
    "LastName": "Joshi"}
}

如果由于dynamic类型而发生这种情况,那么我不想更改类型,因为我不确定所有键/值请求者可能发送的内容。我正在使用dynamic数据从中提取数据。

这表示正在解析EmailData并添加额外的花括号。

enter image description here

4 个答案:

答案 0 :(得分:3)

使用Dictionary对象代替动态,它将绑定您的键值对数据

    public class Email
    {
        public string EmailTo { get; set; }

        public Dictionary<string,string> EmailData { get; set; }
    }

你的json将会,

{
  "EmailTo": "abc.xyz@abc.com",
  "EmailData": {
    "FirstName": "Rushi",
    "LastName": "Joshi"}
}

答案 1 :(得分:0)

提供的JSON有效: https://jsonlint.com/

具有多个属性的对象将始终以该格式返回。

"EmailData": {
    "FirstName": "Rushi",
    "LastName": "Joshi"}

这是一个具有两个名称/值对的EmailData对象。您的对象嵌套在原始对象中。

以下是一些文档供您阅读以供进一步说明。 https://www.json.org/

答案 2 :(得分:0)

如果要将动态JSON存储在Email类中,则可以使用Newtonsoft.Json包。

    public class Email
    {
        public string EmailTo { get; set; }

        public JOject EmailData { get; set; }
    }

它将存储任何类型的JSON。因此,您可以在运行时解析内部JSON对象。

答案 3 :(得分:0)

谢谢大家,是的,你们都给了一个很好的答案,特别感谢Stevenfowler16,他们描述了JSON对象应该被处理的正确方法。

事情是我无法删除动态对象类型,因为它来自其他一些库,我也无法将任何内容更改为API的签名。但是下面的事情帮了我。

import React from 'react';
import {Editor, ConvertFromRaw} from 'draft-js';

const ReadOnlyEditor = (props) => {
  const storedState =  ConvertFromRaw(JSON.parse(props.storedState));
  return (
     <div className="readonly-editor">
       <Editor editorState={storedState} readOnly={true} /> 
     </div>
  );
}

这符合我的目的,但再次感谢大家,您的解决方案为我提供了一些方向。

此致

如是