2012-01-10 114 views
0

我有以下只有FIRST和LAST名稱的代碼。 DeserializeObject正在尋找FIRST MIDDLE LAST。所以約翰史密斯會顯示,但不是John P Smith。有沒有辦法只找到姓和名?我可以分開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 2012-01-10 18:59:10

+0

當然。更改已添加 – MrM 2012-01-10 19:01:56

+0

在你的空構造函數內你可以重載或設置你正在尋找的屬性..否則從它的外觀..它看起來像所有3個屬性將設置..這是否有意義 – MethodMan 2012-01-10 19:08:05

回答

2

JSON.NET,讓您可以爲不用標記屬性的一個很好的方式 - 你可以使用DataContractDataMember屬性。

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也有它們自己的一組屬性,並且在下面@B.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 2012-01-10 20:05:14

+0

如果我沒有使用任何'DataMember',那麼對於「must」屬性來說就是一個例外,我會放鬆什麼。它可以很容易地通過'if(obj.FirstName == null)'進行檢查,速度更快。 – 2012-01-10 20:09:37

+0

對於用'DataContract'屬性聲明的類,@svick的默認行爲是隱藏成員,除非它們應用了'DataMember'屬性。類似於WCF服務。 – 2012-01-10 20:18:01

1

你可以改變的構造或kepp它作爲一個空的構造以及創建和重載的構造

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 
相關問題