- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
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 counties;
}
最佳答案
LINQ-to-JSON API(JObject
、JToken
等)的存在是为了允许使用 JSON 而无需提前知道其结构。您可以使用 JToken.Parse
反序列化任何任意 JSON ,然后使用其他 JToken
检查和操作其内容方法。如果您只需要 JSON 中的一个或两个值(例如县名),LINQ-to-JSON 也能很好地工作。
JsonConvert.DeserializeObject
,另一方面,主要用于当你提前知道 JSON 的结构并且你想反序列化为强类型类时使用。例如,以下是如何将完整的县数据集从 JSON 获取到 County
的列表中。对象。
class Program
{
static void Main(string[] args)
{
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'}]}";
foreach (County c in JsonParseCounties(countiesJson))
{
Console.WriteLine(string.Format("{0}, {1} ({2},{3})", c.name,
c.state_abbreviation, c.primary_latitude, c.primary_longitude));
}
}
public static List<County> JsonParseCounties(string jsonText)
{
return JsonConvert.DeserializeObject<RootObject>(jsonText).Counties;
}
}
public class RootObject
{
[JsonProperty("Everything")]
public List<County> Counties { get; set; }
}
public class County
{
public string county_name { get; set; }
public string description { get; set; }
public string feat_class { get; set; }
public string feature_id { get; set; }
public string fips_class { get; set; }
public string fips_county_cd { get; set; }
public string full_county_name { get; set; }
public string link_title { get; set; }
public string url { get; set; }
public string name { get; set; }
public string primary_latitude { get; set; }
public string primary_longitude { get; set; }
public string state_abbreviation { get; set; }
public string state_name { get; set; }
}
注意 Json.Net 使用给定 JsonConvert.DeserializeObject
的类型参数方法来确定要创建的对象类型。
当然,如果你在调用DeserializeObject
时没有指定类型,或者您使用 object
或 dynamic
, 那么 Json.Net 别无选择,只能反序列化为 JObject
. (您可以通过检查 JObject
自己看到您的动态变量实际上包含一个 jResults.GetType().FullName
。)所以在那种情况下,JsonConvert.DeserializeObject
之间没有太大区别。和 JToken.Parse
;两者都会给你相同的结果。
关于c# - JObject.Parse 与 JsonConvert.DeserializeObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23645034/
这个问题已经有答案了: JsonConvert.DeserializeObject could not convert string to DateTime when using non-us dat
我有一个如下所示的 JSON 响应 { "msg": "1", "code": "2", "data": [ { "a": "3",
我想在我的应用程序加载时使用 JSON.Net 来处理配置文件的解析。将所有 KVP 保持在同一范围内绝对没问题。但是,我想将其分解为子类别,例如 Settings.WebServer、Setting
这个问题在这里已经有了答案: Deserializing nested JSON structure to a flattened class with Json.NET using annotat
我知道有很多关于 JSON 的问题遍布整个互联网和 StackOverflow。但是我无法让我的 JSON 正常工作,所以我希望我能在这里得到一些帮助。[使用 C#、Visual Studio] 我有
所有这些都来自https://github.com/JamesNK/Newtonsoft.Json/issues/469 发在这里是因为我先是在SO上看,没有看到任何东西,所以我在项目的GitHub页
我收到一个无效的强制转换异常,表明指定的强制转换无效。在这条线上: RootObject mountain = JsonConvert.DeserializeObject(json1); 来自docu
我有以下来自 Web 服务的 JSON 对象 { "room":{ "name":"Thunderdome", "created_at":"2012/04/15 00:3
我想将我现有的枚举属性标记为过时并添加新的以实现相同的功能。因此,我的项目中有两个枚举(新的和标记过时的)可用。 在使用 jsonconvert.deserializeobject 函数序列化此枚举值
我从网络请求中获取一个 JSON 编码的字符串。 字符串像这样返回 "{\"key\":\"value\"}" 当我尝试使用来自 JsonConvert 的 DeserializeObject 解析它
这个问题在这里已经有了答案: Json.NET case-sensitive deserialization (1 个回答) 关闭 6 年前。 我正在尝试将字符串内容反序列化为对象,但我希望内容区分
我有一些继承,需要自定义 JsonConverter 进行反序列化。我现在使用一种非常直接的方法,根据某些属性的存在来确定类型。 重要说明:在我的实际代码中,我无法触及DeserializeObjec
我有这样的 json 字符串输出: 字符串 apiResult = { "error":[], "result":{ "RARAGA":{ "a":["4",
这个问题在这里已经有了答案: Detect if deserialized object is missing a field with the JsonConvert class in Json.N
我有一个来自网络服务的结果,字符串结果是: {"status":"success","data":{"address":"aa@aa.aa","unconfirmed":[{"tx":"cb2f252
Newtonsoft.Json.DeserializeObject 会抛出哪些异常?我想处理它们。 http://james.newtonking.com/json/help/?topic=html/
我有以下类定义: public class Tag { public Guid? TagId { get; set; } public string TagText { get; se
我正在编写一个解决方案,其中包含一个 ASP.NET Web API (.NET 4.6.2)(又名后端)、一个 Web API 客户端实现 PCL(即中间件)和 Xamarin.Forms 项目(即
我有这个对象 public class ConversationAPI { [JsonProperty(PropertyName = "lU")] public DateTime La
在 Xamarin 项目中,我有包含以下代码的 PCL 库。 我们定义一个 ConcurrentQueue .消费者在对象初始化时为此 Task已附上: _syncConsumer = new Tas
我是一名优秀的程序员,十分优秀!