2012-01-10 3 views
0

У меня есть следующий код с именем FIRST и LAST. DeserializeObject ищет ПЕРВЫЙ БЛИЖНИЙ ПОСЛЕДНИЙ. Так Джон Смит покажет, но не Джон П Смит. Есть ли способ найти только имя и фамилию?Могу ли я отделить объекты JsonConvert?

#region Fields 
private string firstName; 
private string middleInitial; 
private string lastName; 
#endregion 

#region Properties 
public string FirstName 
{ 
    get { return firstName; } 
    set { firstName = value; } 
} 
public string MiddleInitial 
{ 
    get { return middleInitial; } 
    set { middleInitial = value; } 
} 
public string LastName 
{ 
    get { return lastName; } 
    set { lastName = value; } 
} 
#endregion 

#region Constructors 
public NamedIndividual() 
{ 

} 

var namedIndividual = JsonConvert.DeserializeObject<NamedIndividual>(cov.GetAttribute("individual").Value); 
+0

вы можете вставить как NamedIndividual объявлен. – MethodMan

+0

уверен. Изменения были добавлены – MrM

+0

внутри вашего пустого конструктора вы можете просто перегрузить это или установить свойства, которые вы ищете там. В противном случае от внешнего вида. Похоже, все 3 свойства будут установлены .. это имеет смысл – MethodMan

ответ

2

JSON.NET имеет приятный способ позволяет отметить свойства не требуется - вы можете используйте DataContract и DataMember атрибуты.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.Serialization; 
using Newtonsoft.Json; 

namespace ConsoleApplication1 
{ 
    [DataContract] 
    public class NamedIndividual 
    { 
     #region Fields 
     private string firstName; 
     private string middleInitial; 
     private string lastName; 
     #endregion 

     #region Properties 

     [DataMember(IsRequired = true)] 
     public string FirstName 
     { 
      get { return firstName; } 
      set { firstName = value; } 
     } 

     [DataMember(IsRequired = false)] 
     public string MiddleInitial 
     { 
      get { return middleInitial; } 
      set { middleInitial = value; } 
     } 

     [DataMember(IsRequired = true)] 
     public string LastName 
     { 
      get { return lastName; } 
      set { lastName = value; } 
     } 

     #endregion 

     public NamedIndividual() 
     { 

     } 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      string name = "{'FirstName':'David', 'MiddleInitial':'Q', 'LastName':'Hoerster'}"; 
      string name1 = "{'FirstName':'David', 'LastName':'Hoerster'}"; 

      var obj = JsonConvert.DeserializeObject<NamedIndividual>(name); 
      var obj1 = JsonConvert.DeserializeObject<NamedIndividual>(name1); 

      Console.WriteLine(obj.MiddleInitial); 
      Console.WriteLine("{0} {1} {2}",obj1.FirstName, obj1.MiddleInitial, obj1.LastName); 
     } 
    } 
} 

Итак, я отмечаю MiddleInitial как дополнительное свойство - так что моя JSON строка может содержать или нет. Если я помечаю свойство по мере необходимости (IsRequired=true), то моя строка JSON будет лучше иметь свойство или исключение будет выбрано.

UPDATE Возможно, я предположил, что вам необходимо использовать атрибуты DataContract, чтобы сделать некоторые свойства такими, какие они не требуются или нет. JSON.net также имеет свой собственный набор атрибутов, а вместе с комментарием @ L.B. ниже, не используя какие-либо атрибуты, обеспечивает поведение по умолчанию, которое ничего не требуется. Вот краткий пример использования JsonObject атрибутов:

[JsonObject(MemberSerialization=MemberSerialization.OptIn)] 
public class NamedIndividual1 
{ 
    [JsonProperty(Required = Required.Always)] 
    public string FirstName { get; set; } 
    [JsonProperty(Required = Required.Default)] 
    public string MiddleInitial { get; set; } 
    [JsonProperty(Required = Required.Always)] 
    public string LastName { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string name2 = "{'FirstName':'David', 'LastName':'Hoerster'}"; 

     var obj2 = JsonConvert.DeserializeObject<NamedIndividual>(name2); 

     Console.WriteLine("{0} {1} {2}", obj2.FirstName, obj2.MiddleInitial, obj2.LastName); 
    } 
} 

(я также не мог использовать любые атрибуты для всего, чтобы быть необязательными.)

Надеется, что это помогает!

+0

Каково поведение по умолчанию (если вы не указываете атрибут)? – svick

+0

Что бы я потерял, если бы я не использовал какой-либо «DataMember», который был бы исключением для свойств «must». Его можно легко проверить с помощью 'if (obj.FirstName == null)', который намного быстрее. –

+0

Поведение @svick по умолчанию для класса, объявленного с атрибутом DataContract, заключается в том, чтобы скрыть элементы, если у них нет атрибута 'DataMember'. Аналогично службам WCF. –

1

вы можете изменить Constructor или Кепп его как пустой Конструктора и создавать и перегруженный конструктор

public NamedIndividual() 
{ 
    //empty Constructor 
} 
//overloaded constructor 
public NamedIndividual(string first, string last) 
{ 
    this.firstname = first; 
    this.lastname = last; 
} 
// or pass in the middle as an option 
Смежные вопросы