C# Firebase Android:在Android 4.2.2上未正确序列化子JSON数组
我正在序列化一个Party对象,如下所示:C# Firebase Android:在Android 4.2.2上未正确序列化子JSON数组,c#,arrays,json,serialization,firebase,C#,Arrays,Json,Serialization,Firebase,我正在序列化一个Party对象,如下所示: public class Party { public long lastPing; public string id; public int ownerId; public List<PartyPlayer> players; public int status; public long created; public long lastServerUpdate; publi
public class Party {
public long lastPing;
public string id;
public int ownerId;
public List<PartyPlayer> players;
public int status;
public long created;
public long lastServerUpdate;
public int balance;
public int size;
public PartyCharacter character;
public string mmcId;
}
public void AddOrUpdateParty(Dictionary<string,object> d) {
string dSer = JsonConvert.SerializeObject (d);
Debug.Log ("Serialized object: " + dSer);
}
但是,当我在Android 4.2.2上运行相同的代码时,players对象不是有效的JSON数组,而是将数组序列化为一个巨大的字符串:
{"id":"key_test","players":"[{id=467, lastPing=1461555567191, name=dragonfly467, character={id=1049, experience=0, visibleSkills=[1, 2, 3], level=1, visibleItems=[4, 0, 0], type=1}}]"}
下面是从firebase获取值的C#包装器:
public string StringValue
{
get
{
AndroidJavaObject javaObject = getJavaObject ().Call<AndroidJavaObject> ("getValue");
return javaObject != null ? javaObject.Call<string> ("toString") : string.Empty;
}
}
现在您可以执行以下操作:
JsonConvert.DeserializeObject<Party> (JsonEditor.recursiveQuotes(d));
JsonConvert.DeserializeObject(JsonEditor.recursiveQuotes(d));
谢谢 您是否有可能为您的
列表安装了类型转换器
?如果你这样做会发生什么?@dbc你是说TypeDescriptor.GetConverter(d[“players”], 是的)?在这种情况下,d是一本字典。我将粘贴整个函数。您能否显示您从服务器接收到的JSON,以及您最初是如何将其反序列化到字典的?@dbc进行了一些挖掘,发现有一个名为MiniJSON的隐藏的底层JSON库正在进行反序列化。似乎更可能的错误是发生在那里。您是否有可能为您的列表安装了类型转换器
?如果你这样做会发生什么?@dbc你是说TypeDescriptor.GetConverter(d[“players”], 是的)?在这种情况下,d是一本字典。我将粘贴整个函数。您能否显示您从服务器接收到的JSON,以及您最初是如何将其反序列化到字典的?@dbc进行了一些挖掘,发现有一个名为MiniJSON的隐藏的底层JSON库正在进行反序列化。似乎更可能的错误是发生在那里。我会随时通知你的。
class JsonEditor {
public static String recursiveQuotes(string s) {
string[] stringify = new string[]{ "id","name", "mmcId", "currentMatch"}; // we have to add the search terms because strings can contain int values and they are impossible to identify by checking the value.
string searchTerm = null;
foreach(string check in stringify) {
if (s.Contains (check+"=")) { // we also replace = with :, so check+= is confirmation there are untouched strings.
searchTerm = check;
}
}
if (searchTerm != null) {
// find the search term and the value that follows it, then replace the value with string quotes
string searchArea = s.Split(new string[]{searchTerm+"="}, StringSplitOptions.None)[1];
string value = searchArea.Split (',') [0];
if(value.Contains("}")) {
value = searchArea.Split('}')[0];
}
string replaceTerm = searchTerm + "=" + value;
string newTerm = searchTerm + ":\"" + value + "\"";
s = s.Replace (replaceTerm, newTerm);
return recursiveQuotes (s);
} else {
return s.Replace("=",":").Replace("\"[", "[").Replace("]\"", "]");
}
return s;
}
}
JsonConvert.DeserializeObject<Party> (JsonEditor.recursiveQuotes(d));