2017-10-19 60 views
3

我有一个JSON字符串,需要转换为JObject。如何解析字符串JObject忽略时区

例子:

String result = ""{"totalSize":1,"done":true,"records":[{"attributes":{"type":"Municipio__c","url":"/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE"},"Id":"a0V2C000000gIgzUAE","LastModifiedDate":"2017-08-01T18:12:04.000+0000"}]}";" 

var json = JObject.Parse(result); 

但是在皈依的时刻,LastModifiedDate改变了价值我时间区。

喜欢的是:

{{ 
    "totalSize": 1, 
    "done": true, 
    "records": [ 
    { 
     "attributes": { 
     "type": "Municipio__c", 
     "url": "/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE" 
     }, 
     "Id": "a0V2C000000gIgzUAE", 
     "LastModifiedDate": "2017-08-01T15:12:04-03:00" 
    } 
    ] 
}} 

时针变为:18时12分04秒(HH:MM:SS)到十五时12分04秒(HH:MM:SS)。

有没有办法忽略解析时区?

+1

这看起来很怪,你确定这一切? –

+0

是的。这是一个功能@MarcoSalerno –

+0

'JObject.Parse'不会修改字符串。 *它不能*。字符串是不可变的。修改后的字符串来自哪里?此外 - 时间没有改变。这是完全一样的。 –

回答

4

你必须使用JsonConvert与适当的DateTimeZoneHandling

var json = JsonConvert.DeserializeObject 
         (result 
         , new JsonSerializerSettings() 
         { DateTimeZoneHandling = DateTimeZoneHandling.Utc 
         } 
         ); 
+0

像魅力一样工作,谢谢。 – Lnacer

1

的时间实例是相同的。 18:12:04+00:0015:12:04-03:0021:12:04+03:00(当前在希腊的抵消)相同。

解析日期值时的默认行为是生成本地DateTime值,即其Kind属性将为DatTimeKind.Local`。其他DateTimeKind值是UTC和未指定。

这并不意味着值更改为Local是一个相对术语,但不知道实际的偏移量,很容易误解它。

正如Patrick Hofman所解释的,您可以通过设置DateTimeZoneHandling设置来指定使用UTC。

更好的方法是使用DateParseHandling = DateParseHandling.DateTimeOffset属性指定将使用DateTimeOffset而不是DateTime。这将返回保留原始区信息:

var settings=new JsonSerializerSettings{ 
    DateParseHandling = DateParseHandling.DateTimeOffset 
}; 
var json = JsonConvert.DeserializeObject(result, settings); 

在这种情况下,该值将是一个DateTimeOffset与原来的时间和00:00偏移。

我使用dynamic这里来减少噪音铸造:

var settings=new JsonSerializerSettings{ 
    DateParseHandling = DateParseHandling.DateTimeOffset 
}; 

dynamic json = JsonConvert.DeserializeObject(result, settings); 
var value=(DateTimeOffset)(json.records[0].LastModifiedDate.Value); 

Console.WriteLine("{0:o}",value); 

这将返回:

2017-08-01T18:12:04.0000000+00:00