Nancy FX在模型绑定中将字典中的键大写

时间:2015-08-04 19:01:19

标签: c# json model-binding nancy

我试图将JSON发布到NancyFx。 JSON如下:

{  
   "prop1": 1,
   "entries":{  
      "Entry1": 1,
      "entry2": 2
   }
}

在服务器端,我创建了一个相应的模型:

public class Model
{
    public int Prop1 { get; set; }
    public IDictionary<string, object> Entries { get; set; }
}
JSON中的

entries字段具有动态结构,因此在模型中使用IDictionary<string, object>

然后我绑定模型:

this.Bind<Model>();

模型创建成功但问题是在Entries字典中两个键都是大写字母。对我来说,情况非常重要,我希望第二个键是 e ntry2 ,而不是 E < /强> ntry2

我还尝试使用JavaScriptConverterJavaScriptPrimitiveConverter,但在Deserialize方法中我获得了大写数据。

任何想法哦如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

对我来说,这是通过配置JavascriptSerializer来保留套管来解决的。

不幸的是,我无法找到一个干净的方法来做到这一点,但这就是我现在正在使用的黑客攻击。

    public class Model
    {
        public IDictionary<string, object> Entries { get; set; }
    }

    public class CustomModelBinder : IModelBinder
    {

        public bool CanBind(Type modelType)
        {
            return modelType == typeof(Model);
        }

        public object Bind(NancyContext context, Type modelType, object instance, BindingConfig configuration, params string[] blackList)
        {
            using (var sr = new StreamReader(context.Request.Body))
            {
                return (new JavaScriptSerializer() { RetainCasing = true }).Deserialize<Model>(sr.ReadToEnd());
            }
        }
    }

Nancy将在运行时选择此绑定程序,无需显式注册任何内容。

此解决方案并不理想,因为它忽略了一些Nancy功能,如黑名单和可能的其他绑定配置设置。

答案 1 :(得分:0)

更好的选择是从Bootstrapper设置JsonSettings

tensor_id

实现IModelBinder可以,但是会弄乱其他默认绑定设置。