2012-01-10 5 views
0

다음 코드는 FIRST 및 LAST 이름 만 있습니다. DeserializeObject는 FIRST MIDDLE LAST를 찾고 있습니다. 그래서 존 스미스는 보여줄 것이지만 존 스미스는 보여주지는 않을 것입니다. 이름과 성을 찾는 방법이 있습니까?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가 필요하지 않습니다 당신이 속성을 표시 할 수 있도록하는 좋은 방법이 - 당신은 할 수 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 문자열의 속성이 더 좋거나 예외가 발생합니다.

업데이트 일부 속성을 필요 없게 만들려면 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

"must"속성에 대한 예외 이외의'DataMember'를 사용하지 않으면 어떻게 될까요? 훨씬 빠른 if (obj.FirstName == null)로 쉽게 검사 할 수 있습니다. –

+0

@svick 기본 동작은'DataContract' 속성으로 선언 된 클래스에서'DataMember' 속성이 적용되지 않는 한 멤버를 숨기는 것입니다. WCF 서비스와 유사합니다. –

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 
관련 문제