Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ObjectContent问题序列化JSON_C#_Json_Asp.net Web Api_Serialization_Json.net - Fatal编程技术网

C# 使用ObjectContent问题序列化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() {

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

… 
        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);
//并使用对象。。。