Могу ли я отделить объекты JsonConvert? - PullRequest
0 голосов
/ 10 января 2012

У меня есть следующий код, который имеет только имя FIRST и LAST.DeserializeObject ищет ПЕРВУЮ СРЕДНЮЮ ПОСЛЕДНЮЮ.Так показывал Джон Смит, но не Джон П Смит.Есть ли способ искать только имя и фамилию?

#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);

Ответы [ 2 ]

2 голосов
/ 10 января 2012

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 будет лучше свойство, или будет сгенерировано исключение.

ОБНОВЛЕНИЕ Я мог подразумевать, что вам нужно использовать атрибуты 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);
    }
}

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

Надеюсь, это поможет!

1 голос
/ 10 января 2012

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...