C# 使用ObjectContent问题序列化JSON
我编写了一个HTTP客户机库,供我们现有的一个进程使用。它发送一个post请求,其中正文中包含JSON内容。填充请求内容和对象本身的代码如下所示C# 使用ObjectContent问题序列化JSON,c#,json,asp.net-web-api,serialization,json.net,C#,Json,Asp.net Web Api,Serialization,Json.net,我编写了一个HTTP客户机库,供我们现有的一个进程使用。它发送一个post请求,其中正文中包含JSON内容。填充请求内容和对象本身的代码如下所示 … HttpRequestMessage httpMessage = new HttpRequestMessage(HttpMethod.Post, "http://localhost"); MyWireObject request = new MyWireObject() {
…
HttpRequestMessage httpMessage = new HttpRequestMessage(HttpMethod.Post, "http://localhost");
MyWireObject request = new MyWireObject()
{
Email = "user@test.com",
Document = JToken.Parse(@"{""content"": ""data"", ""content2"": ""data2""}")
};
httpMessage.Content = new ObjectContent(typeof(MyWireObject), request, new JsonMediaTypeFormatter());
//httpMessage.Content = new StringContent(JToken.FromObject(request).ToString(), Encoding.UTF8, "application/json");
var content = httpMessage.Content;
string jsonContent = content.ReadAsStringAsync().Result;
…
public class MyWireObject
{
[JsonProperty(PropertyName = "Email")]
public string Email
{
get; set;
}
[JsonProperty(PropertyName = "Document")]
public JToken Document
{
get; set;
}
}
当我将客户端库与我编写的独立exe一起使用时,它可以很好地序列化JSON。但当我将其与现有流程集成时,结果(在jsonContent中捕获)如下所示:
{"Email":"user@test.com","Document":{"content":[],"content2":[]} }
基本上,JToken字段的所有值都丢失了。如果我使用StringContent而不是ObjectContent,就像在注释行中一样,它会工作
我能想到的独立exe和现有进程之间的一个区别是,该进程在网络服务帐户下运行。这是由于帐户权限吗?还是我用错了?或者是由于.NET或Newtonsoft.Json.Linq中的某些已知错误造成的
谢谢。为什么不换一种方式使用Newtonsoft.Json:
using Newtonsoft.Json;
// First define the classes you will need ...
public class Document
{
public string Content1 { get; set; }
public string Content2 { get; set; }
// ...
}
public class MyWireObject
{
public string Email { get; set; }
public Document Document { get; set; }
}
// Later, create an instance and serialize it as the body of your request ...
HttpRequestMessage httpMessage = new HttpRequestMessage(HttpMethod.Post, "http://localhost");
MyWireObject myWireObject = new MyWireObject()
{
Email = "user@test.com",
Document = new Document()
{
Content1 = "content1",
Content2 = "content2",
// ...
}
};
httpMessage.Content = JsonConvert.SerializeObject(myWireObject);
// Later in the POST handler ...
string myWireObjectAsString = httpMessage.Content.ReadAsStringAsync().Result;
// Or even better ...
MyWireObject myWireObject = JsonConvert.DeserializeObject<MyWireObject>(myWireObjectAsString);
// And use the object ...
使用Newtonsoft.Json;
//首先定义您需要的类。。。
公共类文档
{
公共字符串Content1{get;set;}
公共字符串Content2{get;set;}
// ...
}
公共类MyWireObject
{
公共字符串电子邮件{get;set;}
公共文档文档{get;set;}
}
//稍后,创建一个实例并将其序列化为请求主体。。。
HttpRequestMessage httpMessage=新的HttpRequestMessage(HttpMethod.Post)http://localhost");
MyWireObject MyWireObject=新建MyWireObject()
{
电子邮件=”user@test.com",
文档=新文档()
{
Content1=“Content1”,
Content2=“Content2”,
// ...
}
};
httpMessage.Content=JsonConvert.SerializeObject(myWireObject);
//在后期处理程序中。。。
字符串myWireObjectAsString=httpMessage.Content.ReadAsStringAsync().Result;
//或者更好。。。
MyWireObject MyWireObject=JsonConvert.DeserializeObject(myWireObjectAsString);
//并使用对象。。。
为什么不采取不同的方法并使用Newtonsoft.Json:
using Newtonsoft.Json;
// First define the classes you will need ...
public class Document
{
public string Content1 { get; set; }
public string Content2 { get; set; }
// ...
}
public class MyWireObject
{
public string Email { get; set; }
public Document Document { get; set; }
}
// Later, create an instance and serialize it as the body of your request ...
HttpRequestMessage httpMessage = new HttpRequestMessage(HttpMethod.Post, "http://localhost");
MyWireObject myWireObject = new MyWireObject()
{
Email = "user@test.com",
Document = new Document()
{
Content1 = "content1",
Content2 = "content2",
// ...
}
};
httpMessage.Content = JsonConvert.SerializeObject(myWireObject);
// Later in the POST handler ...
string myWireObjectAsString = httpMessage.Content.ReadAsStringAsync().Result;
// Or even better ...
MyWireObject myWireObject = JsonConvert.DeserializeObject<MyWireObject>(myWireObjectAsString);
// And use the object ...
使用Newtonsoft.Json;
//首先定义您需要的类。。。
公共类文档
{
公共字符串Content1{get;set;}
公共字符串Content2{get;set;}
// ...
}
公共类MyWireObject
{
公共字符串电子邮件{get;set;}
公共文档文档{get;set;}
}
//稍后,创建一个实例并将其序列化为请求主体。。。
HttpRequestMessage httpMessage=新的HttpRequestMessage(HttpMethod.Post)http://localhost");
MyWireObject MyWireObject=新建MyWireObject()
{
电子邮件=”user@test.com",
文档=新文档()
{
Content1=“Content1”,
Content2=“Content2”,
// ...
}
};
httpMessage.Content=JsonConvert.SerializeObject(myWireObject);
//在后期处理程序中。。。
字符串myWireObjectAsString=httpMessage.Content.ReadAsStringAsync().Result;
//或者更好。。。
MyWireObject MyWireObject=JsonConvert.DeserializeObject(myWireObjectAsString);
//并使用对象。。。