0

我有一个 Web 服务,可以“侦听”发送 JSON 数据的 HTTP POST 请求 - 这是执行此操作的方法的开始:

// POST api/blah
[HttpPost]
public HttpResponseMessage PostPicture(HttpRequestMessage msg)
{
    string data = msg.Content.ReadAsStringAsync().Result;
...

变量“data”包含原始 JSON,本质上,它只是一个格式化为 JSON 的字符串。这是变量“数据”:

{
  "longitude" : 96.84610000000001,
  "latitude" : 35.5608,
  "username" : "mgallow",
  "imageDataBlob" : "\/9j\/4UI5RXhpZgAASUkqAAg..... and so on
}

最后,我将这些数据插入到数据库中——经度和纬度是十进制类型,用户名是 nvarchar(50) 类型,imageDataBlob 是 varbinary(MAX) 类型。下面的代码以相同的方法获取 JSON 数据并将其反序列化为“图片”类型的对象,该对象代表我在数据库中的表:

[HttpPost]
public HttpResponseMessage PostPicture(HttpRequestMessage msg)
{
    string data = msg.Content.ReadAsStringAsync().Result;

    Picture obj = Activator.CreateInstance<Picture>();

    using (MemoryStream stream1 = new MemoryStream(Encoding.Unicode.GetBytes(data)))
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
        obj = (Picture)serializer.ReadObject(stream1);
    }
    ...

但我得到的错误,我明白我为什么得到它,是:

反序列化 blah.Models.Picture 类型的对象时出错。应来自命名空间“”的结束元素“imageDataBlob”。找到文本“/”。

研究表明这是因为它需要一个 varbinary,而是获取一个字符串(来自 JSON)。作为测试的一部分,我将表中的数据类型更改为 nvarchar(MAX),并且不再出现该错误。

我的问题是:

如何获取作为字符串传入的 JSON,并将其正确映射到我的对象,该对象是字符串、十进制和字节 [] 的混合体?

4

3 回答 3

1

看看 base64 编码 - 这应该会给你一些想法......

于 2013-05-03T13:25:03.157 回答
1

您的imageDataBlob字段似乎是 base64 编码的。在您的班级中将其声明为字符串Picture,然后使用Convert.FromBase64String

于 2013-05-03T13:26:11.940 回答
1

我建议您在形成 JSON 之前对数据进行 Base64 编码。同样,您可以在将数据更新到数据库之前对服务器端的数据进行解码。

于 2013-05-03T13:27:45.260 回答