使用 Json Net 解析单个整数

Parsing a Single Integer with Json Net

我正在尝试用 Json.Net 解析一个简单的长整数。这是响应的样子:

header:

{
  Transfer-Encoding: chunked
  Date: Fri, 03 Jul 2015 16:15:33 GMT
  Server: Apache-Coyote/1.1
  Content-Type: application/json
}

body 就是:1435775316000

在 Java 的 gson 库中,我可以这样解析它:

Long one = gson.fromJson("1435775316000", Long.class);

我的 .Net 客户端中有一个方法来解析响应,但它希望它采用 Json 格式:

    private static JObject sendRequest(String params)
    {
        try
        {

            HttpResponseMessage response = Client.GetAsync(params).Result;

            if (response.IsSuccessStatusCode)
            {
                var jsonResponse = response.Content.ReadAsStringAsync().Result;
                return JObject.Parse(jsonResponse);
            }
            else
            {
                //do something else
            }
        }
        catch (Exception e)
        {
            //throw
        }
    }

如果响应采用 Json 映射格式,则此方法工作正常: { "version" : "1435775316000" }

但服务只是 returns: 1435775316000

同样,响应的 header 表示它在 Json 中。如何使用 Json.Net 库允许此操作。

编辑: 我可能应该问一下争论我的案子的正确方法是什么。服务端的开发人员说 return 一个整数是可以的,认为这对服务实现来说是更多的工作,并且必须创建一个 json object。我不同意,并且相信它应该 return 一个适当的 json object,就像对上述服务的所有其他调用一样。我怎样才能说服服务开发人员这样做?我要求太多了吗?我的意思是,在服务端更容易 return 一个简单的 int,但这意味着在我这边我必须检查是否将它解析为 object 或标记 json值。

如果服务只是 returns "1435775316000" 那么那不是真的 JSON - 或者至少,它不是 JSON object,这至少是 returning JSON 的一种更广泛使用的方法。你可以用 long.Parse:

解析它
long value = long.Parse(jsonResponse);

如果您真的需要从中创建一个 JObject,您可以轻松地这样做:

JObject wrapped = new JObject(value);

...但我怀疑这是否真的是个好主意。

另一种选择是将其理解为 JSON value。您可以将方法更改为 return JToken,并使用:

return JToken.Parse(jsonResponse);

下面是一个显示该方法有效的示例:

using System;
using Newtonsoft.Json.Linq;

class Test
{ 
    static void Main(string[] args) 
    {
        var jsonObject = "{ \"name\": \"foo\" }";
        var jsonLong = "123456";
        Console.WriteLine(JToken.Parse(jsonObject).GetType()); // JObject
        Console.WriteLine(JToken.Parse(jsonLong).GetType()); // JValue
    }
}

使用对象的 Value 属性,将其转换为非字符串类型:

dynamic json = JsonConvert.DeserializeObject(result);
item.CredentialDescription = json.Credentials[0].CredentialDescription.Value;
item.CardNumber = (int)json.Credentials[0].CardNumber.Value;