Это хороший способ десериализации строки JSON Facebook? - PullRequest
3 голосов
/ 28 декабря 2011

Это моя первая попытка десериализации строки JSON, возвращенной Facebook.
Я хочу убедиться, что будущие разработчики смогут удобно поддерживать мой код, поэтому я хотел бы знать, нормально ли это сделать.Я обеспокоен тем, что если строка JSON изменится, мне нужно будет переписать некоторые из моих классов.
Может ли строка JSON, возвращенная из Facebook, измениться?Например, если местоположение стало другим объектом, мне нужно будет внести изменения правильно?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Web;
//--- If you are not able to add reference dont worry. You probably need to install ASP.NET Ajax or target higher .NET Framework (3.5 or 4).
//---   There are Stack Overflow threads about this.
using System.Web.Script.Serialization;

//--- Our Facebook Person class.
public class FBPerson
{
    public string id { get; set; }
    public string email { get; set; }
    public string name { get; set; }
    public string gender { get; set; }
    public IDName location { get; set; }
    public List<FBObject> work { get; set; }
    public List<FBObject> education { get; set; }
}
//-- In some cases only id and name will be accessed
public class IDName
{
    public string id { get; set; }
    public string name { get; set; }
    public string type { get; set; }
}
//-- work and education presently are array of json strings
public class FBObject
{
    public IDName employer { get; set; }
    public IDName school { get; set; }
}
static class Program
{
    //-- Sample JSON string returned by Facebook
    const string json2 = @"{
        ""id"":""11111111111111111"",
        ""name"":""Tester Test"",
        ""first_name"":""Tester"",
        ""last_name"":""Test"",
        ""link"":""http:\/\/www.facebook.com\/profile.php?id=11111111111111111"",
        ""location"":
            {""id"":""107991659233606"",""name"":""Atlanta, Georgia""},
        ""work"":
            [{""employer"":{""id"":""222222222222222222"",""name"":""Various""}}],
        ""education"":
            [
                {""school"":{""id"":""108000000000000"",""name"":""Test High School""},""type"":""High School""},
                {""school"":{""id"":""105000000000000"",""name"":""Tester College""},""type"":""College""}
            ],
        ""gender"":""male"",
        ""email"":""tester\u0040gmail.com"",
        ""timezone"":-5,""locale"":""en_US"",
        ""verified"":true,
        ""updated_time"":""2011-11-21T21:10:20+0000""
    }";

    static void Main()
    {
        JavaScriptSerializer ser = new JavaScriptSerializer();
        FBPerson fperson = ser.Deserialize<FBPerson>(json2);

        //-- Display the user info from the JSON string
        Console.WriteLine(fperson.id.ToString());
        Console.WriteLine(fperson.name.ToString());
        Console.WriteLine(fperson.gender.ToString());
        Console.WriteLine(fperson.email.ToString());
        Console.WriteLine(fperson.location.name.ToString());
        Console.WriteLine(fperson.work[0].employer.name.ToString());
        Console.WriteLine(fperson.education[0].school.name.ToString());
        Console.ReadLine();
    }
}

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011

Я не знаю, открыты ли вы для других подходов, но в случае, если вы захотите попробовать, вот альтернативный способ, который не требует FBPerson IDName FBObject классов и использует Json.Net и это методы расширения

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Text;

static class Program
{
    //-- Sample JSON string returned by Facebook
    const string json2 = @"{
        ""id"":""11111111111111111"",
        ""name"":""Tester Test"",
        ""first_name"":""Tester"",
        ""last_name"":""Test"",
        ""link"":""http:\/\/www.facebook.com\/profile.php?id=11111111111111111"",
        ""location"":
            {""id"":""107991659233606"",""name"":""Atlanta, Georgia""},
        ""work"":
            [{""employer"":{""id"":""222222222222222222"",""name"":""Various""}}],
        ""education"":
            [
                {""school"":{""id"":""108000000000000"",""name"":""Test High School""},""type"":""High School""},
                {""school"":{""id"":""105000000000000"",""name"":""Tester College""},""type"":""College""}
            ],
        ""gender"":""male"",
        ""email"":""tester\u0040gmail.com"",
        ""timezone"":-5,""locale"":""en_US"",
        ""verified"":true,
        ""updated_time"":""2011-11-21T21:10:20+0000""
    }";

    public static void Main()
    {

        dynamic fperson = JsonUtils.JsonObject.GetDynamicJsonObject(json2);

        //-- Display the user info from the JSON string
        Console.WriteLine(fperson.id.ToString());
        Console.WriteLine(fperson.name.ToString());
        Console.WriteLine(fperson.gender.ToString());
        Console.WriteLine(fperson.email.ToString());
        Console.WriteLine(fperson.location.name.ToString());
        Console.WriteLine(fperson.work[0].employer.name.ToString());
        Console.WriteLine(fperson.education[0].school.name.ToString());
        Console.ReadLine();
    }
}
2 голосов
/ 28 декабря 2011

Это кажется нормальным. Независимо от того, как вы делаете десериализацию, изменения в формате данных JSON вас сломают. По этой причине авторы API очень стараются избежать внесения таких изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...