我试图将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
我还尝试使用JavaScriptConverter
和JavaScriptPrimitiveConverter
,但在Deserialize
方法中我获得了大写数据。
任何想法哦如何解决这个问题?
答案 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可以,但是会弄乱其他默认绑定设置。