2017-04-05 67 views
0

我试图反序列化c#applicatie中的一些JSON代码。我使用DataContractJsonSerializer类来执行此操作。一切工作正常,直到我得到的嵌套一个JSONObjects,UWP和嵌套的json对象

我收到以下JSON从外部API:

[{"name":"Beeldscherm","json":"{\"onHomeEnter\":{\"state\":0,\"delay\":0,\"fadeTime\":0,\"active\":false,\"updatedAt\":1487166732440},\"onHomeExit\":{\"state\":0,\"delay\":120,\"fadeTime\":0,\"active\":false,\"updatedAt\":1487163669388},\"onRoomEnter\":{\"state\":1,\"delay\":0,\"fadeTime\":0,\"active\":false,\"updatedAt\":1},\"onRoomExit\":{\"state\":0,\"delay\":120,\"fadeTime\":0,\"active\":false,\"updatedAt\":1},\"onNear\":{\"state\":1,\"delay\":0,\"fadeTime\":0,\"active\":false,\"updatedAt\":1487164911729},\"onAway\":{\"state\":0,\"delay\":2,\"fadeTime\":0,\"active\":false,\"updatedAt\":1487164909184}}","id":"58a44fa04f40b016004ffca2","sphereId":"58a44c0a4f40b016004ffc9d","createdAt":"2017-02-15T13:52:12.783Z","updatedAt":"2017-02-15T12:55:05.332Z"}] 

我与下面的代码编辑:

responJsonText = responJsonText.Replace("\\", "").Replace("\"{", "{").Replace("}\"", "}"); 

,并就检查像这样:

[{"name":"Beeldscherm","json":{"onHomeEnter":{"state":0,"delay":0,"fadeTime":0,"active":false,"updatedAt":1487166732440},"onHomeExit":{"state":0,"delay":120,"fadeTime":0,"active":false,"updatedAt":1487163669388},"onRoomEnter":{"state":1,"delay":0,"fadeTime":0,"active":false,"updatedAt":1},"onRoomExit":{"state":0,"delay":120,"fadeTime":0,"active":false,"updatedAt":1},"onNear":{"state":1,"delay":0,"fadeTime":0,"active":false,"updatedAt":1487164911729},"onAway":{"state":0,"delay":2,"fadeTime":0,"active":false,"updatedAt":1487164909184}},"id":"58a44fa04f40b016004ffca2","sphereId":"58a44c0a4f40b016004ffc9d","createdAt":"2017-02-15T13:52:12.783Z","updatedAt":"2017-02-15T12:55:05.332Z"}] 

并尝试使用以下类进行解析:

[DataContract] 
class Appliance 
{ 
    [DataMember] 
    public String name { get; set; } 
    [DataMember] 
    public ApplianceJson json { get; set; } 
    [DataMember] 
    public String id { get; set; } 
    [DataMember] 
    public String sphereId { get; set; } 
    [DataMember] 
    public String createdAt { get; set; } 
    [DataMember] 
    public String updatedAt { get; set; } 
} 

[DataContract] 
class ApplianceJson 
{ 
    [DataMember] 
    public ApplianceEvents onHomeEnter { get; set; } 
    [DataMember] 
    public ApplianceEvents onHomeExit { get; set; } 
    [DataMember] 
    public ApplianceEvents onRoomEnter { get; set; } 
    [DataMember] 
    public ApplianceEvents onRoomExit { get; set; } 
    [DataMember] 
    public ApplianceEvents onNear { get; set; } 
    [DataMember] 
    public ApplianceEvents onAway { get; set; } 
} 

[DataContract] 
class ApplianceEvents 
{ 
    [DataMember] 
    public int state { get; set; } 
    [DataMember] 
    public int delay { get; set; } 
    [DataMember] 
    public int fadeTime { get; set; } 
    [DataMember] 
    public bool active { get; set; } 
    [DataMember] 
    public int updatedAt { get; set; } 
} 

和反序列化下面的代码:

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<Appliance>)); 
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(responJsonText)); 

我得到的错误是:

Exception thrown: 'System.Runtime.Serialization.SerializationException' in System.Private.DataContractSerialization.dll 
Exception thrown: 'System.Runtime.Serialization.SerializationException' in mscorlib.ni.dll 

是否有人看到的东西,是错误的,我怎么能解决这个问题?

更新 我检查JSON字符串和其正确的,现在,我已经把这个问题的正确版本

更新2 加入原JSON

+1

你的Json不解析。尝试在线Json解析器,看看你是否收到适当的Json。 – AVK

+0

你应该看看是否有内部异常有更多的细节。 – crashmstr

+0

@AVKNaidu那里确实有json的错误,这是因为给了JSON的API将字符串中json对象的json元素转换为字符串,而我只删除了\,而不是“围绕该对象,但它仍然没有没有工作。 – furrie

回答

0

如果您发现原始Json,你可以看到"不是\",但是如果你深入JSON,Json节点本身有"作为\"。所以我首先清理了所有的\",然后再次用"替换\"使用了Newtonsoft Json,然后解析成功。看到我的答案。

使用This站点和您的JsonString,下面是我创建的正确的Json类结构。

public class Appliance 
{ 
    public string name { get; set; } 
    public Json json { get; set; } 
    public string id { get; set; } 
    public string sphereId { get; set; } 
    public string createdAt { get; set; } 
    public string updatedAt { get; set; } 
} 

public class OnHomeEnter 
{ 
    public int state { get; set; } 
    public int delay { get; set; } 
    public int fadeTime { get; set; } 
    public bool active { get; set; } 
    public long updatedAt { get; set; } 
} 

public class OnHomeExit 
{ 
    public int state { get; set; } 
    public int delay { get; set; } 
    public int fadeTime { get; set; } 
    public bool active { get; set; } 
    public long updatedAt { get; set; } 
} 

public class OnRoomEnter 
{ 
    public int state { get; set; } 
    public int delay { get; set; } 
    public int fadeTime { get; set; } 
    public bool active { get; set; } 
    public int updatedAt { get; set; } 
} 

public class OnRoomExit 
{ 
    public int state { get; set; } 
    public int delay { get; set; } 
    public int fadeTime { get; set; } 
    public bool active { get; set; } 
    public int updatedAt { get; set; } 
} 

public class OnNear 
{ 
    public int state { get; set; } 
    public int delay { get; set; } 
    public int fadeTime { get; set; } 
    public bool active { get; set; } 
    public long updatedAt { get; set; } 
} 

public class OnAway 
{ 
    public int state { get; set; } 
    public int delay { get; set; } 
    public int fadeTime { get; set; } 
    public bool active { get; set; } 
    public long updatedAt { get; set; } 
} 

public class Json 
{ 
    public OnHomeEnter onHomeEnter { get; set; } 
    public OnHomeExit onHomeExit { get; set; } 
    public OnRoomEnter onRoomEnter { get; set; } 
    public OnRoomExit onRoomExit { get; set; } 
    public OnNear onNear { get; set; } 
    public OnAway onAway { get; set; } 
} 

一旦这样做,我用Json.Net 到JsonString解析到Appliance对象

下面是最后的JSON字符串和分析器。

"[{\"name\":\"Beeldscherm\",\"json\":{\"onHomeEnter\":{\"state\":0,\"delay\":0,\"fadeTime\":0,\"active\":false,\"updatedAt\":1487166732440},\"onHomeExit\":{\"state\":0,\"delay\":120,\"fadeTime\":0,\"active\":false,\"updatedAt\":1487163669388},\"onRoomEnter\":{\"state\":1,\"delay\":0,\"fadeTime\":0,\"active\":false,\"updatedAt\":1},\"onRoomExit\":{\"state\":0,\"delay\":120,\"fadeTime\":0,\"active\":false,\"updatedAt\":1},\"onNear\":{\"state\":1,\"delay\":0,\"fadeTime\":0,\"active\":false,\"updatedAt\":1487164911729},\"onAway\":{\"state\":0,\"delay\":2,\"fadeTime\":0,\"active\":false,\"updatedAt\":1487164909184}},\"id\":\"58a44fa04f40b016004ffca2\",\"sphereId\":\"58a44c0a4f40b016004ffc9d\",\"createdAt\":\"2017 - 02 - 15T13: 52:12.783Z\",\"updatedAt\":\"2017 - 02 - 15T12: 55:05.332Z\"}]"; 

以下是我如何成功解析Json。

List<Appliance> appJson = JsonConvert.DeserializeObject<List<Appliance>>(JsonData); 

祝你好运。

+1

我发现答案就在你发布答案之前,只是“(我已经删除了),而且还是”在json块周围,用{} {用{和}}替换它后,它工作了,但是谢谢你研究它。 – furrie