C# 使用Json.NET从Parse.NET平台反序列化Parse对象

C# 使用Json.NET从Parse.NET平台反序列化Parse对象,c#,json,parse-platform,xamarin.android,json.net,C#,Json,Parse Platform,Xamarin.android,Json.net,我正在尝试反序列化ParseObject(如中所述)。我得到一个错误,JSON无法反序列化该对象 所以我创造了这个: public class Phase { public string Details { get; set; } public string ObjectId { get; set; } public int PhaseId { get; set; } public bool Completed { get; set; } public s

我正在尝试反序列化ParseObject(如中所述)。我得到一个错误,JSON无法反序列化该对象

所以我创造了这个:

public class Phase
{
    public string Details { get; set; }
    public string ObjectId { get; set; }
    public int PhaseId { get; set; }
    public bool Completed { get; set; }
    public string PhaseListName { get; set; }
    public int Position { get; set; }
    public int ButtonId { get; set; }
}

private List<ParseObject> ConvertToParseObjectList(List<Phase> phaseObjects)
{
    var _objects = new List<ParseObject>();
    for (int i = 0; i < phaseObjects.Count; i++)
    {
        var _obj = new ParseObject("CasePhases");
        _obj.ObjectId = phaseObjects[i].ObjectId;
        _obj["Details"] = phaseObjects[i].Details;
        _obj["PhaseId"] = phaseObjects[i].PhaseId;
        _obj["Completed"] = phaseObjects[i].Completed;
        _objects.Add(_obj);
    }
    return _objects;
}

private List<Phase> ConvertToPhaseObjectList(List<ParseObject> parseObjects)
{
    var target = parseObjects.ConvertAll(x => new Phase
    {
        Details = x.Get<string>("Details"),
        ObjectId = x.ObjectId,
        PhaseId = x.Get<int>("PhaseId"),
        Completed = x.Get<bool>("Completed")
    });
    return target;
}
公共类阶段
{
公共字符串详细信息{get;set;}
公共字符串ObjectId{get;set;}
public int PhaseId{get;set;}
公共bool已完成{get;set;}
公共字符串PhaseListName{get;set;}
公共int位置{get;set;}
公共int按钮{get;set;}
}
私有列表转换器ParseObjectList(列表阶段对象)
{
var_objects=新列表();
对于(int i=0;inewphase
{
Details=x.Get(“Details”),
ObjectId=x.ObjectId,
PhaseId=x.Get(“PhaseId”),
已完成=x.Get(“已完成”)
});
回报目标;
}
所以我可以像这样序列化和反序列化:

ConvertToParseObjectList(JsonConvert.DeserializeObject<List<Phase>>(Settings.PhaseObjects));
JsonConvert.SerializeObject(ConvertToPhaseObjectList( application.casePhases));
ConvertToParseObjectList(JsonConvert.DeserializeObject(Settings.PhaseObjects));
SerializeObject(ConvertToPhaseObjectList(application.casePhases));
这是可行的,但我试图找出如何告诉JSON如何使用JsonObject和JsonProperty或类似的东西来反序列化对象

表示异常的行是:

JsonConvert.DeserializeObject<List<ParseObject>>(Settings.PhaseObjects);
JsonConvert.DeserializeObject(设置.PhaseObject);
而线索是:

Xamarin caused by: android.runtime.JavaProxyThrowable: Newtonsoft.Json.JsonSerializationException: Cannot create and populate list type Parse.ParseObject. Path '[0]', line 1, position 2.
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewList(JsonReader reader, JsonArrayContract contract, ref bool createdFromNonDefaultCreator)<2781d1b198634655944cdefb18b3309b>:0
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, object existingValue, string id)<2781d1b198634655944cdefb18b3309b>:0
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue)<2781d1b198634655944cdefb18b3309b>:0
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, string id)<2781d1b198634655944cdefb18b3309b>:0
md5b8608fa4770a86d5bda0b33ebcfbec27.LiveSurgery.n_onResume(Native Method)
md5b8608fa4770a86d5bda0b33ebcfbec27.LiveSurgery.onResume()LiveSurgery.java:65
android.app.Instrumentation.callActivityOnResume()Instrumentation.java:1197
android.app.Activity.performResume()Activity.java:5496
android.app.ActivityThread.performResumeActivity()ActivityThread.java:2975
android.app.ActivityThread.handleResumeActivity()ActivityThread.java:3018
android.app.ActivityThread.handleLaunchActivity()ActivityThread.java:2422
android.app.ActivityThread.access$800()ActivityThread.java:151
android.app.ActivityThread$H.handleMessage()ActivityThread.java:1342
android.os.Handler.dispatchMessage()Handler.java:110
android.os.Looper.loop()Looper.java:193
android.app.ActivityThread.main()ActivityThread.java:5322
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke()Method.java:515
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run()ZygoteInit.java:829
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:645
dalvik.system.NativeStart.main(Native Method)
Xamarin由以下原因引起:android.runtime.JavaProxyThrowable:Newtonsoft.Json.JsonSerializationException:无法创建和填充列表类型Parse.ParseObject。路径“[0]”,第1行,位置2。
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewList(JsonReader、JsonArrayContract契约、ref-bool createdFromNonDefaultCreator):0
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader阅读器,类型objectType,JsonContract合约,JsonProperty成员,对象existingValue,字符串id):0
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader阅读器,类型objectType,JsonContract契约,JsonProperty成员,JsonContainerContract容器契约,JsonProperty容器成员,对象existingValue):0
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList列表、JsonReader阅读器、JsonArrayContract契约、JsonProperty容器属性、字符串id):0
md5b8608fa4770a86d5bda0b33ebcfbec27.活体外科手术。n_onResume(本地方法)
md5b8608fa4770a86d5bda0b33ebcfbec27.LiveSurgery.onResume()LiveSurgery.java:65
android.app.Instrumentation.callActivityOnResume()Instrumentation.java:1197
Activity.performResume()Activity.java:5496
android.app.ActivityThread.performResumeActivity()ActivityThread.java:2975
android.app.ActivityThread.handleResumeActivity()ActivityThread.java:3018
android.app.ActivityThread.handleLaunchActivity()ActivityThread.java:2422
android.app.ActivityThread.access$800()ActivityThread.java:151
android.app.ActivityThread$H.handleMessage()ActivityThread.java:1342
android.os.Handler.dispatchMessage()Handler.java:110
loop()Looper.java:193
android.app.ActivityThread.main()ActivityThread.java:5322
java.lang.reflect.Method.Invokenactive(本机方法)
java.lang.reflect.Method.invoke()方法。java:515
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run()ZygoteInit.java:829
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:645
dalvik.system.NativeStart.main(本机方法)

@CDrosos-好的,看看您的回溯,问题是1)
ParseObject
实现了
IEnumerable
,因此被序列化为数组,但没有公共无参数构造函数或构造函数接受
IEnumerable
参数,因此无法反序列化。2) 虽然这是可修复的(虽然不容易;请看,值是非类型化的,因此类型标识将丢失。因此,与其尝试存储
ParseObject
,为什么不只存储
阶段
POCO?Json.NET应该能够(de)毫无困难地序列化它,您已经有了将它映射到
ParseObject
@dbc的代码。我在想我的解决方案是否不是最好的,但我认为可能是最好的,所以我会保持原样,谢谢:D还有,什么是POCO?:D。即使是Microsoft。@dbc哈哈哈,听起来很有趣:D。尽快抓到一个POCO:D