简介:在使用JavaScriptSerializer.Deserialize时,如何将JSON数据中的字段名称映射到.Net对象的字段名称?
更长版本:我从服务器API(未在.Net中编码)向我发送以下JSON数据
{"user_id":1234, "detail_level":"low"}
Run Code Online (Sandbox Code Playgroud)
我有以下C#对象:
[Serializable]
public class DataObject
{
[XmlElement("user_id")]
public int UserId { get; set; }
[XmlElement("detail_level")]
public DetailLevel DetailLevel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
其中DetailLevel是一个枚举,其中"低"作为其中一个值.
此测试失败:
[TestMethod]
public void DataObjectSimpleParseTest()
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
DataObject dataObject = serializer.Deserialize<DataObject>(JsonData);
Assert.IsNotNull(dataObject);
Assert.AreEqual(DetailLevel.Low, dataObject.DetailLevel);
Assert.AreEqual(1234, dataObject.UserId);
}
Run Code Online (Sandbox Code Playgroud)
最后两个断言失败,因为这些字段中没有数据.如果我将JSON数据更改为
{"userid":1234, "detaillevel":"low"}
Run Code Online (Sandbox Code Playgroud)
然后它通过.但我不能改变服务器的行为,我希望客户端类在C#语言中具有良好命名的属性.我不能使用LINQ to JSON,因为我希望它在Silverlight之外工作.看起来XmlElement标签没有任何效果.我不知道我在哪里知道它们是相关的,它们可能不是.
你如何在JavaScriptSerializer中进行字段名称映射?它可以完成吗?
考虑重定向的ASP.NET Web API服务
public class ThisController : ApiController
{
/* more methods */
public override HttpResponseMessage Post()
{
var result = new HttpResponseMessage(HttpStatusCode.MovedPermanently);
// Post requests should be made to "ThatController" instead.
string uri = Url.Route("That", null);
result.Headers.Location = new Uri(uri, UriKind.Relative);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
试图验证POST数据到"api/this"会将你重定向到"api/that",我有以下测试方法:
[TestMethod]
public void PostRedirects()
{
using (var client = CreateHttpClient("application/json"))
{
var content = CreateContent(expected, "application/json");
using (var responseMessage = client.PostAsync("api/this", content).Result)
{
Assert.AreEqual(HttpStatusCode.MovedPermanently, responseMessage.StatusCode);
Assert.AreEqual(new Uri("https://api.example.com/api/that"), responseMessage.Headers.Location);
}
}
}
protected HttpClient …Run Code Online (Sandbox Code Playgroud) 在使用ASP MVC V5和属性路由的解决方案中,我在测试项目中进行了非常简单的测试.属性路由和MapMvcAttributeRoutes方法是ASP MVC 5的一部分.
[Test]
public void HasRoutesInTable()
{
var routes = new RouteCollection();
routes.MapMvcAttributeRoutes();
Assert.That(routes.Count, Is.GreaterThan(0));
}
Run Code Online (Sandbox Code Playgroud)
这导致:
System.InvalidOperationException :
This method cannot be called during the applications pre-start initialization phase.
Run Code Online (Sandbox Code Playgroud)
此错误消息的大多数答案涉及在web.config文件中配置成员资格提供程序.该项目既没有成员资格提供者也没有web.config文件,因此出于某种其他原因似乎发生了错误.如何将代码移出此"预启动"状态以便测试可以运行?
调用ApiController后的工作属性的等效代码HttpConfiguration.EnsureInitialized().
我们有一些SQL服务器报告服务报告.我当时没有写,但我必须照顾他们.
这些报告在浏览器中打开时触发,并且使用默认参数(搜索条件和限制为空白),它们检索大量数据,这很慢.客户端希望在用户输入参数并按"查看报告"之前不生成报告
不幸的是,我根本不了解SSRS - 如何在打开报告时停止报告?
点击报告,点击顶部的"属性".您可能需要稍等一下,因为慢速报告可能正在运行.然后单击左侧的"参数".
对于每个参数,请确保选中"提示用户",并且对于至少一个参数,不选中"已默认".再次单击左上角的"查看"(或返回文件夹并单击报告名称)以查看报告,并注意报告不会立即触发.
在报告构建器中,您可以通过"过滤器"菜单执行此操作.从至少一个过滤器中取消选择值,然后保存报告.
报告没有参数时,是否也可以停止报告加载?
只是试着继续关注IOC原则.
Q1:静态方法 - 是否应将带有静态辅助方法的util类与IOC连接?
例如,如果我有一个带有许多静态方法的HttpUtils类,我应该尝试通过IOC将它传递给其他业务逻辑类吗?
关注这个问题可能是:
Q2:Singletons - 通过Logger.getInstance()类型调用,通常可以访问它的内容.您是否通常将其保留原样,并且不使用IOC将记录器注入需要它的业务类?
问题3:静态类 - 我还没有真正使用过这个概念,但如果你转向基于IOC的方法,那么你是否有任何指导方针可以解决这个问题.
提前致谢.
lambdas () => DoSomethingAsync()和async () => await DoSomethingAsync()两者都输入时有区别Func<Task>吗?我们应该选择哪一个?何时?
这是一个简单的控制台应用程序
using System;
using System.Threading.Tasks;
namespace asyncDemo
{
class Program
{
static void Main(string[] args)
{
var demo = new AsyncDemo();
var task = demo.RunTheDemo();
task.Wait();
Console.ReadLine();
}
}
public class AsyncDemo
{
public async Task Runner(Func<Task> action)
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + " Launching the action");
await action();
}
private async Task DoSomethingAsync(string suffix)
{
await Task.Delay(2000);
Console.WriteLine(DateTime.Now.ToLongTimeString() + " Done something, " + suffix);
}
public async …Run Code Online (Sandbox Code Playgroud) 我正在使用C#和.Net 3.5中的桌面客户端程序与Web服务器进行交互.我正在使用Fiddler来查看Web浏览器发送的流量,并模拟它.可悲的是,这台服务器已经很老了,对于charsets和utf-8的概念有点困惑.大多数情况下它使用Latin-1.
当我在包含"特殊"字符的Web浏览器中输入数据时,如"Ωπℵ♣♥♥♉♉♋♌♌♎♏♐♑♓♓",fiddler告诉我它们从浏览器传送到服务器如下: "♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ "
但对于我的客户端,HttpUtility.HtmlEncode不会转换这些字符,而是将它们保留为原样.我需要打电话将"♈"转换为♈ 等等?
有没有人有成功将事务报告到NewRelic的ServiceStack Api的示例代码?
这似乎并不是微不足道的 - 它不是开箱即用的,添加一个RequestFilter调用NewRelic.Api.Agent.NewRelic.SetTransactionName不会改变它.
服务器和应用程序似乎配置正确 - 同一IIS服务器上的其他应用程序(ASP WebForms和ASP MVC)正确报告.我们正在使用IIS 7.5.每个应用程序都在自己的应用程序池中,并NewRelic.AppName在web.config中有一个
我有一些分层数据 - 每个条目都有一个id和一个(可空)父条目id.我想检索给定条目下树中的所有条目.这是在SQL Server 2005数据库中.我在C#3.5中使用LINQ to SQL查询它.
LINQ to SQL不直接支持公用表表达式.我的选择是使用几个LINQ查询在代码中汇编数据,或者在面向CTE的数据库上进行查看.
当数据量变大时,您认为哪个选项(或其他选项)会表现更好?Linq to SQL是否支持SQL Server 2008的HierarchyId类型?
我正在测试ASP MVC路由.我在ASP MVC 5.1中遇到属性路由问题
当我有这样的控制器时:
public class FooController : Controller
{
[Route("foo")]
[HttpGet]
public ActionResult Get()
{
....
}
[Route("foo")]
[HttpPost]
public ActionResult Post()
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
然后为了测试哪个路由匹配特定请求,我打电话routes.GetRouteData.我得到一个System.Web.Routing.RouteData包含路由以及应该说明哪个控制器和操作匹配的值.
问题是这个路由现在是RouteCollectionRoute的一个实例,
这个内部类是这两个动作的一组路由的包装器.控制器在RouteData.values,但行动不是.你可以得到这些包含的路线routeData.Values["MS_DirectRouteMatches"] as IList<RouteData>.
在给出的示例中,列表中将有两个路径,用于两个操作方法.我需要知道哪些包含的路由实际匹配,以便我可以读取匹配路由的操作方法名称.我该如何解决这条路线?
我有点不知所措的设计选择RouteCollectionRoute.路由时,您有一个路由集合,然后通过调用解析URL的路由GetRouteData.现在你有一条路线.但如果它是一个RouteCollectionRoute如此仍然是路线的集合和路线解决尚未结束.有一个RouteCollectionRoute获得了什么?路线解决现在是一个两步过程吗?还是一个递归过程?
我知道我正在浏览ASP MVC的内部,但这是唯一的方法,因为它真的没有考虑到这种可测试性.即使是暴露一些内部类或方法等简单的事情也会有很大帮助!
asp.net-mvc asp.net-mvc-routing attributerouting asp.net-mvc-5.1
c# ×3
asp.net-mvc ×2
asp.net ×1
async-await ×1
asynchronous ×1
c#-3.0 ×1
c#-4.0 ×1
encoding ×1
html ×1
instance ×1
json ×1
lambda ×1
linq ×1
newrelic ×1
ninject ×1
parsing ×1
servicestack ×1
sql ×1
sql-server ×1
static ×1
unit-testing ×1
utf-8 ×1
web-services ×1