我有以下代码:
var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);
Run Code Online (Sandbox Code Playgroud)
输入responsecontent是JSON,但未正确解析为对象.我应该如何正确地反序列化它?
是否可以使用json.net从json反序列化返回动态对象?我想做这样的事情:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Run Code Online (Sandbox Code Playgroud) C#4.0引入了一种名为"dynamic"的新类型.这听起来不错,但程序员会用它做什么?
有没有可以节省一天的情况?
尝试将JSON字符串转换为C#中的对象.使用一个非常简单的测试用例:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Run Code Online (Sandbox Code Playgroud)
问题是routes_list永远不会被设置; 这是一个未定义的对象.有任何想法吗?
我正在关注RazorGenerator上的这篇文章,它说我必须添加对以下内容的引用:
System.Web.Helpers.dllSystem.Web.WebPages.dllSystem.Web.Razor.dll我唯一能看到的Add Reference就是System.Web.Razor,但我不知道其他的在哪里.
JsonConvert.DeserializeObject和JObject.Parse有什么区别?据我所知,两者都是一个字符串,并在Json.NET库中.什么样的情况会使一个人比另一个人更方便,还是主要只是偏好?
作为参考,这里有一个例子,我用两者做同样的事情 - 解析一个Json字符串并返回一个Json属性的列表.
public ActionResult ReadJson()
{
string countiesJson = "{'Everything':[{'county_name':null,'description':null,'feat_class':'Civil','feature_id':'36865',"
+"'fips_class':'H1','fips_county_cd':'1','full_county_name':null,'link_title':null,'url':'http://www.alachuacounty.us/','name':'Alachua County'"+ ",'primary_latitude':'29.7','primary_longitude':'-82.33','state_abbreviation':'FL','state_name':'Florida'},"+
"{'county_name':null,'description':null,"+ "'feat_class':'Civil','feature_id':'36866','fips_class':'H1','fips_county_cd':'3','full_county_name':null,'link_title':null,'url':'http://www.bakercountyfl.org/','name':'Baker County','primary_latitude':'30.33','primary_longitude':'-82.29','state_abbreviation':'FL','state_name':'Florida'}]}";
//Can use either JSONParseObject or JSONParseDynamic here
List<string> counties = JSONParseObject(countiesJson);
JSONParseDynamic(countiesJson);
return View(counties);
}
public List<string> JSONParseObject(string jsonText)
{
JObject jResults = JObject.Parse(jsonText);
List<string> counties = new List<string>();
foreach (var county in jResults["Everything"])
{
counties.Add((string)county["name"]);
}
return counties;
}
public List<string> JSONParseDynamic(string jsonText)
{
dynamic jResults = JsonConvert.DeserializeObject(jsonText);
List<string> counties = new List<string>();
foreach(var county in jResults.Everything)
{
counties.Add((string)county.name);
}
return …Run Code Online (Sandbox Code Playgroud) 假设我有一个动态变量:
dynamic d = *something*
Run Code Online (Sandbox Code Playgroud)
现在,有些东西d从字符串数组中创建了我拥有的属性:
string[] strarray = { 'property1','property2',..... }
Run Code Online (Sandbox Code Playgroud)
我事先不知道房产名称.
如何在代码d中创建一次并从数据库中提取strarray,我可以获取值吗?
我想得到d.property1 , d.property2.
我看到该对象有一个_dictionary包含键和值的内部字典,如何检索它们?
我们有一个MVC(MVC4)应用程序,有时可能会将第三方发布的JSON事件发送到我们的特定URL(" http://server.com/events/ ").JSON事件位于HTTP POST的主体中,正文是严格的JSON(Content-Type: application/json- 不是某些字符串字段中带有JSON的表单).
如何在控制器的主体内接收JSON主体?我尝试了以下但没有得到任何东西
[编辑]:当我说没有得到任何东西时,我的意思是jsonBody始终为null,无论我是将其定义为Object或string.
[HttpPost]
// this maps to http://server.com/events/
// why is jsonBody always null ?!
public ActionResult Index(int? id, string jsonBody)
{
// Do stuff here
}
Run Code Online (Sandbox Code Playgroud)
请注意,我知道如果我使用强类型输入参数声明方法,MVC会进行整个解析和过滤,即
// this tested to work, jsonBody has valid json data
// that I can deserialize using JSON.net
public ActionResult Index(int? id, ClassType847 jsonBody) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,我们获得的JSON非常多样,因此我们不希望为每个JSON变体定义(和维护)数百个不同的类.
我正在通过以下curl命令测试它(这里有一个JSON的变体)
curl -i -H "Host: localhost" -H "Content-Type: …Run Code Online (Sandbox Code Playgroud) 当我向服务发送请求(我不拥有)时,它可能会响应请求的JSON数据,或者出现如下错误:
{
"error": {
"status": "error message",
"code": "999"
}
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,HTTP响应代码都是200 OK,所以我不能用它来确定是否有错误 - 我必须反序列化要检查的响应.所以我有一些看起来像这样的东西:
bool TryParseResponseToError(string jsonResponse, out Error error)
{
// Check expected error keywords presence
// before try clause to avoid catch performance drawbacks
if (jsonResponse.Contains("error") &&
jsonResponse.Contains("status") &&
jsonResponse.Contains("code"))
{
try
{
error = new JsonSerializer<Error>().DeserializeFromString(jsonResponse);
return true;
}
catch
{
// The JSON response seemed to be an error, but failed to deserialize.
// Or, it may be a successful JSON response: do nothing.
} …Run Code Online (Sandbox Code Playgroud) 在C#中,我已经使用这样的代码成功地将匿名对象序列化为JSON ...
var obj = new { Amount = 108, Message = "Hello" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
String output = serializer.Serialize(obj);
Run Code Online (Sandbox Code Playgroud)
但是,我希望以后能够将JSON字符串反序列化为匿名对象.像这样......
var obj2 = serializer.Deserialize(output, object);
Run Code Online (Sandbox Code Playgroud)
但是serializer.Deserialize()方法需要第二个参数,它是要反序列化的对象类型.
我试过这个......
var obj2 = serializer.Deserialize(output, obj.GetType());
Run Code Online (Sandbox Code Playgroud)
但这会产生错误:
没有为'<> f__AnonymousType0`2 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String,mscorlib,Version = 4.0.0.0,Culture]的类型定义无参数构造函数=中立,PublicKeyToken = b77a5c561934e089]]'.
我不确定这个错误意味着什么.