使用 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;
我正在尝试用 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;