请考虑以下事项:您有一个返回JSON字符串的服务,并且在您的C#代码中,您希望将返回的值用作对象(例如:通过其名称获取它的各种属性)。
示例JSON:
{
"Name": "Jon Smith",
"Address":
{
"City": "New York",
"State": "NY"
},
"Age": 42
}
示例C#用法:
var object = ... // this is what I am asking for
Console.WriteLine(object.Name); // this should print out "Jon Smith"
Console.WriteLine(object.Address.State); // this should print out "NY"
C#没有使用第三方库时有哪些选项?
答案 0 :(得分:5)
如果您不知道确切的数据合同(或者您不关心它),那么您可以在System.Web.Helpers.Json
课程和{{3}的帮助下轻松完成此操作。对象:
dynamic json = System.Web.Helpers.Json.Decode(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }");
Console.WriteLine(json.Name); // prints "Jon Smith"
Console.WriteLine(json.Address.State); // prints "NY"
关于这一点的说明:您必须添加对System.Web.Helpers
程序集的引用。
当然不是每个人都喜欢dynamic
,有些人更喜欢有明确定义的数据合同。对他们来说,解决方案有点长:
您必须为数据合同创建匹配的类,并dynamic
:
// class for the root object:
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public Address Address { get; set; }
[DataMember]
public int Age { get; set; }
}
// class for the address object:
[DataContract]
public class Address
{
[DataMember]
public string City { get; set; }
[DataMember]
public string State { get; set; }
}
您可以使用attribute them accordingly属性标记成员,然后忽略它们,或添加IgnoreDataMember
以强制它们。
定义这些合同后,您可以轻松地将JSON字符串解析为Person
对象:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
using( MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }")))
{
var person = (Person)ser.ReadObject(stream);
Console.WriteLine(person.Name); // prints "Jon Smith"
Console.WriteLine(person.Address.State); // prints "NY"
}
注意:IsRequired=true
位于System.ServiceModel.Web
程序集中,因此您必须为此添加引用。 (当然还有System.Runtime.Serialization
组装。)
为了便于使用,您可以向数据协定类添加静态Parse
和TryParse
方法:
public static Person Parse(string jsonString)
{
if (String.IsNullOrWhiteSpace(jsonString)) throw new ArgumentNullException("The jsonString parameter shouldn't be null or an empty string.");
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
return (Person)ser.ReadObject(stream);
}
}
public static bool TryParse(string jsonString, out Person result)
{
try
{
result = Person.Parse(jsonString);
return true;
}
catch (Exception ex)
{
if (ex is ArgumentNullException || ex is SerializationException)
{
result = null;
return false;
}
throw;
}
}
作为L.B.在他们的评论中提到,您可以使用DataContractJsonSerializer
- 如果您添加对System.Web.Extensions
程序集的引用 - 以使其更简单:
var person = new JavaScriptSerializer().Deserialize<Person>(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }");
为此,你仍然需要上面的课程,但是你可以省去 - &#34;丑陋的&#34; - 如果你愿意的话。 (但是使用这种方法,你将失去将部件标记为强制性的能力......)