Десериализация JSON в C # - PullRequest
       12

Десериализация JSON в C #

3 голосов
/ 21 октября 2010

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

Я смотрю на десериализацию Ответов от API GetResponse:

Простой например

{
    "result" : {
        "updated" : "1"
    },
    "error" : null
}

Другой:

{
    "result" : null,
    "error"  : "Missing campaign"
}

Вот еще один более сложный потенциалответ:

{
    "result" : {
        "CAMPAIGN_ID" : { // <-- This value will be different for each Campaign
            "name"              : "my_campaign_1",
            "from_name"         : "My From Name",
            "from_email"        : "me@emailaddress.com",
            "reply_to_email"    : "replies@emailaddress.com",
            "created_on"        : "2010-01-01 00:00:00"
        }
    },
    "error" : null
}

И, наконец, как должен выглядеть мой объект?

Сначала я просто играл что-то подобное ...

 private struct GenericResult {
     public string error;
     public Dictionary<string, object> result;
 }

Это будет работать для всех моих ответов, но затем, чтобы получить доступ к свойствам объекта, мне придется его разыграть, если я не ошибаюсь.

Я хочу использовать его следующим образом:

JavaScriptSerializer jss = new JavaScriptSerializer();
var r = jss.Deserialize<GenericResult>(response_string);

// or... if I'm going to use a non-Generic object
var r = jss.Deserialize<GetCampaignResult>(response_string);

РЕДАКТИРОВАТЬ

После получения данных, фактическая структура имеет одну заминку.Вот фактический пример:

Значение

{
    "error":null,
    "result":
        {"ABQz": { // <-- As you can see, this is NOT a class name.
           "from_email" : "from@email.com",
           "created_on" : "2010-10-15 12:40:00",
           "name"       : "test_new_subscribers",
           "from_name"  : "John Smith",
           "reply_to_email": "from@email.com"
        }
    }
}

Теперь, когда я не знаю, каким будет это значение, я в тупике.Я хотел бы включить это значение в качестве идентификатора для Campaign объекта.

Ответы [ 2 ]

1 голос
/ 21 октября 2010
{
    "result" : {
        "CAMPAIGN_ID" : {
            "name"              : "my_campaign_1",
            "from_name"         : "My From Name",
            "from_email"        : "me@emailaddress.com",
            "reply_to_email"    : "replies@emailaddress.com",
            "created_on"        : "2010-01-01 00:00:00"
        }
    },
    "error" : null
}

У меня был бы такой, который выглядел бы так: [попытка без safetynet .. где мой компилятор!?!?;)]

public class TheResponse {
  public RESULT result { get; set; }
  public object error { get; set; }
}

public class RESULT {
  public CAMPAIGN_ID campaign_ID { get; set; }
}

public class CAMPAIGN_ID {
  public string name { get; set; }
  public string from_name { get; set; }
  public string from_email { get; set; }
  public string reply_to_email { get; set; }
  public string created_on { get; set; }
}

Но да, вам придется как-то когда-нибудь привести его где-нибудь, как-нибудь.

Но я думаю, что код тут же переводит между ними.


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

http://pastebin.com/7Tzr2RBz -> http://pastebin.com/NQwu3hZK (обновлено)

http://pastebin.com/a0aMzcE4

Эти два работают вместе (один с клиента (JS), один с сервера (C #)), так что вы можете видетькак у меня дела (не то чтобы это скорее всего помогло, но я стараюсь)

Happy JSONing

1 голос
/ 21 октября 2010

Я вижу три объекта из вашего примера.

Class CampaignId {

    String name ;
    String from_Name ;
    String from_Email ;
    \\ etc
}

Class Result {
   CampaignId campaignId  ;
}


Class RpcResponse {
   String error ;
   Result result ;
}

Вам нужны атрибуты DataMember?

хорошая статья на F #, которую я использовал при изучении сериализации JSON: http://blogs.msdn.com/b/jomo_fisher/archive/2010/03/06/neat-sample-f-and-freebase.aspx

Развивая ответ ниже, вы можете представить некоторые обобщения:

Class CampaignId {

    String name ;
    String from_Name ;
    String from_Email ;
    \\ etc
}

Class Result<T> {
   <T> data ;
}


Class RpcResponse<T> {
   String error ;
   Result<T> result ;
}

И инициализировать сериализатор с помощью

JavaScriptSerializer jss = new JavaScriptSerializer(); 
var r = jss.Deserialize<RpcResponse<CampaignId>>(response_string); 

еще один достойный урок:

http://publicityson.blogspot.com/2010/06/datacontractjsonserializer-versus.html

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