将JSON DeSerializing到C#

时间:2010-10-20 21:47:46

标签: c# json serialization dictionary

我看到很多简单的JSON DeSerialization示例,但是当涉及到任何稍微复杂的事情时,就会缺少样本。

我正在考虑从GetResponse的API反序列化响应:

很简单,例如

{
    "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对象的ID。

2 个答案:

答案 0 :(得分:1)

我看到你的例子中有三个对象。

Class CampaignId {

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

Class Result {
   CampaignId campaignId  ;
}


Class RpcResponse {
   String error ;
   Result result ;
}

您需要DataMember属性吗?

我在学习JSON序列化时使用的F#中的一篇好文章: 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

答案 1 :(得分:1)

{
    "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
}

我会有一个看起来像这样:[尝试没有安全网..我的编译器在哪里!?!? ;)]

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; }
}

但是,是的,你必须把它投到某个地方,不知何故,某个时候。

但我认为那里的代码可以在两者之间进行转换。


我没有像你一样使用嵌套对象,但是我正在做类似的事情(我有一个List,因此可以进行排序)

http://pastebin.com/7Tzr2RBz - &gt; http://pastebin.com/NQwu3hZK(已更新)

http://pastebin.com/a0aMzcE4

这两个一起工作(一个来自客户端(JS),一个来自服务器(C#)),所以你可以看到我是如何做的(不是它可能有所帮助,但我尝试)

快乐的JSONing