【问题标题】:Serialize JSON using ObjectContent issue使用 ObjectContent 问题序列化 JSON
【发布时间】:2017-06-27 00:30:46
【问题描述】:

我编写了一个 HTTP 客户端库,供我们现有的一个进程使用。它发送一个在正文中包含 JSON 内容的 post 请求。填充请求内容和对象本身的代码如下所示。

… 
        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 中的一些已知错误?

谢谢。

【问题讨论】:

    标签: c# json asp.net-web-api serialization json.net


    【解决方案1】:

    您为什么不采取不同的方法并使用 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 ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2017-06-25
      • 2018-07-22
      • 1970-01-01
      相关资源
      最近更新 更多