【问题标题】:Deserialize JSON with dot in property name使用属性名称中的点反序列化 JSON
【发布时间】:2016-08-01 01:30:00
【问题描述】:

我正在尝试将属性名称中带有点的 JSON 反序列化为键值格式。我正在使用内置的 ASP.NET MVC 模型绑定。它似乎将点解释为对象表示法,而不仅仅是键值对象。有没有办法让它正确反序列化为忽略点的键值?这很重要,因为数据需要以这种格式再次输出。

控制器动作

[HttpPost]
public ActionResult SaveProgress(int id, ProgressVM data)
{
    // ProgressVM Data property has an item with key "prop" and a null value, nothing else
}

查看模型

public class ProgressVM
{
    public int ID { get; set; }
    public Dictionary<string, string> Data { get; set; }
}

JSON 示例

{
    "ID": 123,
    "Data": {
        "prop.0.name": "value",
        "prop.0.id": "value",
        "prop.1.name": "value",
        "prop.2.name": "value",
        "prop.3.name": "value"
    }
}

【问题讨论】:

  • 那么问题出在哪里?发送数据 ckuent-server 或反之亦然?
  • 将数据从客户端发送到服务器,在action方法中反序列化。
  • 如果用逗号、连字符或分号代替点会怎样?
  • 我曾想过更换点,但我希望有更好的解决方案让它正常工作,可能不得不这样做
  • 您能否粘贴SaveProgress 操作调用的代码?我想您通过 AJAX 调用此操作。

标签: c# json asp.net-mvc


【解决方案1】:

我来这里是为了寻找一种将 json 字符串反序列化为模型的方法,虽然这里的问题通过 MVC 框架解决了,但它并没有解决我的问题。

给定一个json字符串

{
   "Property.Something": "The value"
}

我发现使用 [JsonProperty] 属性可以将字符串反序列化到我的模型中,如下所示:

public class JsonModel
{
   [JsonProperty(PropertyName = "Property.Something")]
   public string PropertySomething {get; set;}
}

【讨论】:

    【解决方案2】:

    首先,在POST 操作中传递参数时,您只传递一个参数而不传递多个参数。因此,请尝试创建一个包含 Id 和 ProgressVM 模型的模型。

    现在,关于反序列化的问题。 JsonValueProviderFactory 类似乎有问题,因为它没有从 ProgressVM 模型绑定嵌套的 Dictionary&lt;string, string&gt;。我知道,因为我试图为这个模型创建一个ModelBinder,但它在DictionaryValueProvider 上失败,没有绑定Data 属性。不幸的是,我没有搜索为什么会发生这种情况,这是JsonValueProviderFactory 上的错误吗?我不知道,所以我迅速转向另一种解决方法。

    为什么不尝试将 JSON 字符串提供给控制器而不是模型,然后在控制器的主体中反序列化输入? 看下面的例子:

    JavaScript代码,使用jQuery AJAX发布数据

    var data = {
        "ID": 123,
        "Data": {
            "prop.0.name": "value",
            "prop.0.id": "value",
            "prop.1.name": "value",
            "prop.2.name": "value",
            "prop.3.name": "value"
        }
    }; 
    
    $.ajax({
        url: '@Url.Action("SaveProgress", "Home")',
        data: { "data": JSON.stringify(data) },
        method: "POST"
    });
    

    ASP.NET MVC 控制器操作

    [HttpPost]
    public ActionResult SaveProgress(string data)
    {
        var json = JsonConvert.DeserializeObject<ProgressVM>(data);
        // Rest of code here
    }
    

    这是在回答你的问题吗?

    【讨论】:

    • 感谢您测试所有这些,看来您得到的结果与我相似。将 JSON 作为字符串传入并在操作中反序列化肯定会更好。
    • 如果我们收到的响应在属性名称中有一个点怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多