【发布时间】:2017-10-02 21:30:24
【问题描述】:
我从 C# 调用返回 JSON 的 RESTful Web 服务。该服务可以返回一个任意的 Javascript 对象,我们在编译时不知道它的结构。
通常,它返回一个 JSON 对象,但也有返回简单字符串的情况。当我尝试反序列化简单字符串时,JSON.Net 会引发运行时错误。
dynamic dyn = JsonConvert.DeserializeObject("just a string");
抛出:
Newtonsoft.Json.JsonReaderException was unhandled by user code
HResult=-2146233088
Message=Unexpected character encountered while parsing value: j. Path '', line 0, position 0.
我阅读了以下问题的答案 Is this simple string considered valid JSON? 和共识似乎是返回一个简单的字符串作为 JSON 是合法的,但许多实现还不支持这一点。
这对 JSON.NET 来说是真的吗?处理反序列化可能包含简单类型而不仅仅是对象和数组的 JSON 的解决方法是什么?
这似乎工作正常,我错过了什么吗?
dynamic dyn;
dyn = GetObjectFromJSON("{ \"name\": \"john\", \"age\": 32 }");
Debug.WriteLine((string)Convert.ToString(dyn));
dyn = GetObjectFromJSON("[ \"a\", \"b\", \"c\" ]");
Debug.WriteLine((string)Convert.ToString(dyn));
dyn = GetObjectFromJSON("just a string");
Debug.WriteLine((string)Convert.ToString(dyn));
dyn = GetObjectFromJSON("35");
Debug.WriteLine((string)Convert.ToString(dyn));
dyn = GetObjectFromJSON("true");
Debug.WriteLine((string)Convert.ToString(dyn));
dyn = GetObjectFromJSON(null);
Debug.WriteLine((Object)dyn ?? "(null)");
和
private Object GetObjectFromJSON(string jsonString)
{
if (String.IsNullOrEmpty(jsonString))
{
return null;
}
dynamic jsonResponse;
jsonString = jsonString.Trim();
if (jsonString.StartsWith("{") || jsonString.StartsWith("["))
{
// object or array
jsonResponse = JsonConvert.DeserializeObject(jsonString);
}
else
{
// some literal value
double d;
bool b;
if (Double.TryParse(jsonString, out d))
{
return d;
}
else if (bool.TryParse(jsonString, out b))
{
return b;
}
else
{
// not null, not an object, not an array, not a number, and not a boolean, so it's a string
jsonResponse = jsonString;
}
}
return jsonResponse;
}
【问题讨论】:
-
我相信你认为
dynamic dyn = JsonConvert.DeserializeObject("just a string");是在传递一个字符串,但事实并非如此。试试dynamic dyn = JsonConvert.DeserializeObject("\"just a string\"");看看结果如何:) 查看json spec 了解更多详情。 -
是的,我明白了。您要发布作为答案吗?这就提出了一个不同的问题。看起来web服务应该在http正文中返回带引号的字符串,但是响应中没有双引号。
-
您确定 Web 服务返回的是 JSON 类型而不是纯文本吗?
-
是的,它正在返回 JSON。我将发布一个不同的问题,询问为什么 Java/Jersey 似乎没有引用简单的字符串 JSON 响应。