【问题标题】:DeSerializing JSON to C#将 JSON 反序列化为 C#
【发布时间】:2011-04-28 07:29:09
【问题描述】:

我看到了很多简单的 JSON 反序列化示例,但是当涉及到稍微复杂一些的东西时,就缺少示例。

我正在研究来自 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 包含在内。

【问题讨论】:

    标签: c# json serialization dictionary


    【解决方案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# 中的一篇好文章: Link

    根据下面的响应,您可能需要介绍一些泛型:

    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

    【讨论】:

    • 其实DCS 3.5以后就不需要了
    • 很高兴知道。我让我的团队将 Silverlight / F# UI 构建到 Jboss 服务器 w。 JSON RPC。但是我们很好地使用了 JSON 序列化,并且用泛型做了很多事情。很多 Json RPC 库都有某种类型的信封——这个例子中的结果——女巫引用了一个有效负载......
    • 如果我使用 DataContractJSonSerializer,我想我需要 DataContract 属性。我只是不确定我应该使用它还是 JavascriptSerializer(从 3.5 SP1 开始不推荐使用)
    • 谢谢 drachentern... 不知道。
    • 我不知道它们之间差异的细节,我们依赖 DataContractJSonSerializer 但我们使用的是 f# 并且工程师正在编写代码(我假装这些天来管理并来这里进行我的编码修复)
    【解决方案2】:
    {
        "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; }
    }
    

    但是,是的,您必须以某种方式,某个时间将其投射到某个地方。

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


    我没有像你那样使用嵌套对象,但我正在做类似的事情(我有一个列表,所以可以正常工作)

    http://pastebin.com/7Tzr2RBz -> http://pastebin.com/NQwu3hZK(更新)

    http://pastebin.com/a0aMzcE4

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

    快乐的 JSONing

    【讨论】:

    • JavascriptDeserialize 不会处理强制转换吗?反正我是这么理解的。
    • 应该,是的。除非你使用对象(就像我为错误所做的那样,我不知道“肯定”它会是什么)
    • @Atømix ~ 我什至不使用 json 反序列化器。查看我的粘贴箱
    • 哈哈,我刚刚意识到(在重新阅读我发布的代码时)我在两个地方重复努力......确实是 /facepalm。是的,年轻的代码!!! foreach ( WidgetPageItems w in Items ) { w.ColumnOrder = counter; counter++; }$(items).each(function() { count++; $(this).attr('columnorder', count); str.push(...); }); 但至少它展示了如何在前后使用 JSON 元素 ;) [还有我蹩脚的编码风格!]
    猜你喜欢
    • 2021-06-02
    • 2015-06-07
    • 1970-01-01
    • 2015-08-05
    • 2017-04-11
    • 2019-10-05
    相关资源
    最近更新 更多