【问题标题】:How to map a data contract to refer to correct fields in a JSON object?如何映射数据合约以引用 JSON 对象中的正确字段?
【发布时间】:2012-12-29 13:23:43
【问题描述】:

我正在接收一个类似于以下示例的 JSON 对象。

{
"name1":{"name1a":"value1a","name1b":"value1b"},
"name2":{"name2a":"value2a","name2b":"value2b"}
}

我已经为它建立了一个数据合约(因为我现在只需要访问一个数据字段)就像这样。

[DataContract]
public class MyThingy
{
  [DataMember(Name="name1b")]
  public string Name1b { get; set; }

  public MyThingy() { }

  public MyThingy(String name1b)
  {
    Name1b = name1b;
  }
}

当我序列化对象时,我尝试将它打印出来(这很有效,因为我得到了类的字符串描述)并将它们打印到字段Name1b。最后一部分不起作用,我在那里得到null。我的猜测是我一定是错误地映射了数据合约,但我不知道如何纠正它。

MyThingy 类应该如何声明?

我的 JSON 对象是按照this post 中的描述获取的。

【问题讨论】:

    标签: c# json parsing datacontractserializer


    【解决方案1】:

    我会在这里使用JavaScriptSerializer,

    string json = @"{
        ""name1"":{""name1a"":""value1a"",""name1b"":""value1b""},
        ""name2"":{""name2a"":""value2a"",""name2b"":""value2b""}
        }";
    
    var obj = new JavaScriptSerializer()
              .Deserialize<Dictionary<string, Dictionary<string, string>>>(json);
    
    Console.WriteLine(obj["name1"]["name1b"]);
    

    你也可以同时使用Json.Net和dynamic

    dynamic  obj = JsonConvert.DeserializeObject(json);
    
    Console.WriteLine(obj.name1.name1b);
    

    【讨论】:

    • 您是说更推荐将我从HttpWebRequest 获取的流转换为String 对象并然后 解析它吗?此外-使用我所做的数据合同方法是否完全不可行?我在想,在未来,我可能需要一个比只获得一个字段更高级的解析器。你怎么看?
    • 另外,我不允许在服务器上安装新库。我需要使用默认的 .NET 4(可能是 4.5)来解决它。
    • @AndreasJohansson 如果您使用JavaScriptSerializer 或Json.Net,您可以更好地控制反序列化过程。我会选择其中之一(顺便说一句:MVC 4 默认使用 Json.Net,这是我的最爱)。
    • 很遗憾,我在尝试遵循建议时遇到了这个错误。 Attempt by security transparent method 'x.y.z(p)' to access security critical method 'System.Web.Script.Serialization.JavaScriptSerializer..ctor()' failed. 它建议我将内容更改为 AppDomain。我正在努力寻找一种解决方案,让我 nada 控制服务器。我需要用另一种方式解决它(通过IndexOf 和Substring 解析字符串开始朝我的方向看)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2021-02-04
    相关资源
    最近更新 更多