在.Net中解析自定义JSON对象?
对于我的ASP.Net应用程序,我需要使用返回JSON对象的HTTPRESTAPI。 以下是JSON的外观:在.Net中解析自定义JSON对象?,.net,asp.net,json,.net,Asp.net,Json,对于我的ASP.Net应用程序,我需要使用返回JSON对象的HTTPRESTAPI。 以下是JSON的外观: message: [ { type: "message" href: "/messages/id/23" view_href: /this-is-a-test-message/m-p/23 id: { type: "int" $: 23 } }, { //... } ]
message: [
{
type: "message"
href: "/messages/id/23"
view_href: /this-is-a-test-message/m-p/23
id: {
type: "int"
$: 23
}
},
{ //...
}
]
我可以使用DataContractJsonSerializer类并定义自定义类。但是,我不确定像“$”这样的键如何在.Net中转换为
有什么建议吗?DataContractJsonSerializer有很多局限性,我个人还没有很好的使用经验 我建议使用JSON.NET,或者如果您使用的是.NET4.0,可能是一个
IDynamicObjectMetaProvider
下面是后者的示例,但还有其他几个简单的实现:
这看起来像是做了你想要的事情,包括:
我认为使用标准
DataContractJsonSerializer
读取带有“$”字段的数据没有问题。更多的问题是,我发现您的数据在JSON格式中不是“是”。如果您的意思是问题中的数据只是一个将被序列化的对象,那么序列化的JSON数据如下所示
{
"message": [
{
"type": "message",
"href": "\/messages\/id\/23",
"view_href": "\/this-is-a-test-message\/m-p\/23",
"id": {
"type": "int",
"$": 23
}
}
]
}
或
所有属性都将被双引号引用,斜杠将被转义(请参阅)。您可以在上验证数据是否为正确的JSON数据
要读取(反序列化)或写入(序列化)有关DataContractJsonSerializer
的数据,您可以毫无问题地进行。正如我前面提到的,您应该只使用DataMember
属性的Name
属性:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.IO;
namespace DataContractJsonSerializer4 {
[DataContract]
public class MyId {
[DataMember (Order = 0)]
public string type;
[DataMember (Order = 1, Name="$")]
public int value;
}
[DataContract]
public class Message {
[DataMember (Order = 0)]
public string type { get; set; }
[DataMember (Order = 1)]
public string href { get; set; }
[DataMember (Order = 2)]
public string view_href { get; set; }
[DataMember (Order = 3)]
public MyId id { get; set; }
}
[DataContract]
public class MessageCollection {
[DataMember]
public List<Message> message { get; set; }
}
class Program {
static void Main (string[] args) {
MessageCollection mc = new MessageCollection () {
message = new List<Message> () {
new Message() {
type = "message",
href = "/messages/id/23",
view_href = "/this-is-a-test-message/m-p/23",
id = new MyId() { type="int", value=23}
},
new Message() {
type = "message",
href = "/messages/id/24",
view_href = "/this-is-a-test-message/m-p/24",
id = new MyId() { type="int", value=24}
}
}
};
string json =
"{" +
"\"message\": [" +
"{" +
"\"type\": \"message\"," +
"\"href\": \"\\/messages\\/id\\/23\"," +
"\"view_href\": \"\\/this-is-a-test-message\\/m-p\\/23\"," +
"\"id\": {" +
"\"type\": \"int\"," +
"\"$\": 23" +
"}" +
"}," +
"{" +
"\"type\": \"message\"," +
"\"href\": \"\\/messages\\/id\\/24\"," +
"\"view_href\": \"\\/this-is-a-test-message\\/m-p\\/24\"," +
"\"id\": {" +
"\"type\": \"int\"," +
"\"$\": 24" +
"}" +
"}" +
"]" +
"}";
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (MessageCollection));
using (MemoryStream ms = new MemoryStream (Encoding.Unicode.GetBytes (json))) {
MessageCollection obj = ser.ReadObject (ms) as MessageCollection;
Console.WriteLine ("JSON data can be read. The value of the fist $ field is {0}", obj.message[0].id.value);
using (MemoryStream ms2 = new MemoryStream ()) {
ser.WriteObject (ms2, obj);
string serializedJson = Encoding.UTF8.GetString (ms2.GetBuffer (), 0, (int)ms2.Length);
Console.WriteLine (serializedJson);
}
}
using (MemoryStream memoryStream = new MemoryStream ()) {
memoryStream.Position = 0;
ser.WriteObject (memoryStream, mc);
memoryStream.Flush ();
memoryStream.Position = 0;
StreamReader sr = new StreamReader (memoryStream);
string str = sr.ReadToEnd ();
Console.WriteLine ("The result of custom serialization:");
Console.WriteLine (str);
}
}
}
}
无论谁把$作为变量名推广,都应该挂起来晾干。@spender你是说John Resig…?我提名字是愚蠢的。看看保罗·钱伯斯在推特笑话之后发生了什么。JSON.Net看起来很酷。你能告诉我如何使用重解析对象的属性吗?我在重新解析时遇到一些错误。Item(“response”)注意,我从JSON填充了重新解析的对象string@Vidhyashankar:使用索引器:
repassessed[“response”]
对于重复多次“message”的JSON,我无法使其正常工作。否则,这很好。@Vidhyashankar:我确信,您在使用多个“消息”项时犯了一个简单的错误。请看修改后的代码和我答案中的代码输出。如何将其与旧代码进行比较只需修改MessageCollection mc
和string json
的定义。
var json = '{"message":[{"type":"message","href":"\/messages\/id\/23","view_href":"\/this-is-a-test-message\/m-p\/23","id":{"type":"int","$":23}}]}'
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.IO;
namespace DataContractJsonSerializer4 {
[DataContract]
public class MyId {
[DataMember (Order = 0)]
public string type;
[DataMember (Order = 1, Name="$")]
public int value;
}
[DataContract]
public class Message {
[DataMember (Order = 0)]
public string type { get; set; }
[DataMember (Order = 1)]
public string href { get; set; }
[DataMember (Order = 2)]
public string view_href { get; set; }
[DataMember (Order = 3)]
public MyId id { get; set; }
}
[DataContract]
public class MessageCollection {
[DataMember]
public List<Message> message { get; set; }
}
class Program {
static void Main (string[] args) {
MessageCollection mc = new MessageCollection () {
message = new List<Message> () {
new Message() {
type = "message",
href = "/messages/id/23",
view_href = "/this-is-a-test-message/m-p/23",
id = new MyId() { type="int", value=23}
},
new Message() {
type = "message",
href = "/messages/id/24",
view_href = "/this-is-a-test-message/m-p/24",
id = new MyId() { type="int", value=24}
}
}
};
string json =
"{" +
"\"message\": [" +
"{" +
"\"type\": \"message\"," +
"\"href\": \"\\/messages\\/id\\/23\"," +
"\"view_href\": \"\\/this-is-a-test-message\\/m-p\\/23\"," +
"\"id\": {" +
"\"type\": \"int\"," +
"\"$\": 23" +
"}" +
"}," +
"{" +
"\"type\": \"message\"," +
"\"href\": \"\\/messages\\/id\\/24\"," +
"\"view_href\": \"\\/this-is-a-test-message\\/m-p\\/24\"," +
"\"id\": {" +
"\"type\": \"int\"," +
"\"$\": 24" +
"}" +
"}" +
"]" +
"}";
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (MessageCollection));
using (MemoryStream ms = new MemoryStream (Encoding.Unicode.GetBytes (json))) {
MessageCollection obj = ser.ReadObject (ms) as MessageCollection;
Console.WriteLine ("JSON data can be read. The value of the fist $ field is {0}", obj.message[0].id.value);
using (MemoryStream ms2 = new MemoryStream ()) {
ser.WriteObject (ms2, obj);
string serializedJson = Encoding.UTF8.GetString (ms2.GetBuffer (), 0, (int)ms2.Length);
Console.WriteLine (serializedJson);
}
}
using (MemoryStream memoryStream = new MemoryStream ()) {
memoryStream.Position = 0;
ser.WriteObject (memoryStream, mc);
memoryStream.Flush ();
memoryStream.Position = 0;
StreamReader sr = new StreamReader (memoryStream);
string str = sr.ReadToEnd ();
Console.WriteLine ("The result of custom serialization:");
Console.WriteLine (str);
}
}
}
}
JSON data can be read. The value of the fist $ field is 23
{"message":[{"type":"message","href":"\/messages\/id\/23","view_href":"\/this-is-a-test-message\/m-p\/23","id":{"type":"int","$":23}},{"type":"message","href":"\/messages\/id\/24","view_href":"\/this-is-a-test-message\/m-p\/24","id":{"type":"int","$":24}}]}
The result of custom serialization:
{"message":[{"type":"message","href":"\/messages\/id\/23","view_href":"\/this-is-a-test-message\/m-p\/23","id":{"type":"int","$":23}},{"type":"message","href":"\/messages\/id\/24","view_href":"\/this-is-a-test-message\/m-p\/24","id":{"type":"int","$":24}}]}