Создание экземпляра.Разбор против JsonConvert.DeserializeObject



в чем разница между JsonConvert.DeserializeObject и JObject.Разбирать? Насколько я могу судить, оба берут строку и находятся в 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;
}
642   2  

2 ответов:

API LINQ-to-JSON (JObject,JToken и т. д.) существует, чтобы позволить работать с JSON без необходимости знать его структуру заранее. Вы можете десериализовать любой произвольный JSON с помощью JToken.Parse, затем изучить и манипулировать его содержание с помощью других JToken методы. LINQ-to-JSON также хорошо работает, если вам просто нужно одно или два значения из 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; либо даст вам тот же результат.

JsonConvert.DeserializeObject имеет одно преимущество перед JObject.Разбор: Можно использовать пользовательские JsonSerializerSettings.

Это может быть очень полезно, например, если вы хотите контролировать сроки выполнения. По умолчанию даты десериализуются в объекты DateTime. Это означает, что вы можете получить дату с другим часовым поясом, чем в строке json.

вы можете изменить это поведение, создав JsonSerializerSetting и настройки DateParseHandling к DateParseHandling.тип datetimeoffset.

пример:

var json = @"{ ""Time"": ""2015-10-28T14:05:22.0091621+00:00""}";
Console.WriteLine(json);
// Result: { "Time": "2015-10-28T14:05:22.0091621+00:00" }

var jObject1 = JObject.Parse(json);
Console.WriteLine(jObject1.ToString());
// Result: { "Time": "2015-10-28T15:05:22.0091621+01:00" }

var jObject2 = Newtonsoft.Json.JsonConvert.DeserializeObject(json, 
  new Newtonsoft.Json.JsonSerializerSettings 
  { 
    DateParseHandling = Newtonsoft.Json.DateParseHandling.DateTimeOffset 
  });
Console.WriteLine(jObject2.ToString());
// Result: { "Time": "2015-10-28T14:05:22.0091621+00:00" }

Comments

    Ничего не найдено.