Json.Netを使用して、別のJson.Netライブラリで生成されたJsonデータを逆シリアル化できますか(私はJson.Netの.Net4およびWindows Phoneライブラリを使用しています)?これは私がこれまでに持っているものです:
XNA(.Net 4)で作成されたマップエディターがあり、Json.Net(.Net用)を使用してJsonデータをシリアル化および逆シリアル化できます。データを格納する構造体を作成し、次のようにセリザライズするデータプロパティを指定します。
[JsonObject(MemberSerialization.OptIn)]
public struct LevelData
{
[JsonProperty(PropertyName = "RowCount")]
private int RowCount;
[JsonProperty(PropertyName = "ColCount")]
private int ColCount;
[JsonProperty(PropertyName = "NodeSize")]
private int NodeSize;
[JsonProperty(PropertyName = "LevelNodes")]
private List<Node> LevelNodes;
public LevelData(int rowCount, int colCount, int nodeSize, List<Node> nodes)
{
RowCount = rowCount;
ColCount = colCount;
NodeSize = nodeSize;
LevelNodes = nodes;
}
}
また、Nodeクラスは次のとおりです。
[JsonObject(MemberSerialization.OptIn)]
public class Node
{
[JsonProperty(PropertyName = "ID")]
private int mId;
[JsonProperty(PropertyName = "Position")]
private Vector2 mPosition;
[JsonProperty(PropertyName = "Type")]
private NodeType mType;
[JsonProperty(PropertyName = "Neighbours")]
private List<int> mNeighbours;
....
}
また、Json.Net(Windows Phone用)を使用して、マップエディターから作成されたJsonデータを読み込むWindowsPhoneXNAゲームもあります。このゲームにはLevelDataとNodeがあり、これらはMapEditorの構造体とクラスとまったく同じです。
Json.Netは、.Net4とWindowsPhoneに異なるライブラリを提供します。ただし、それらは同じ機能を持っていないようです。Windows Phoneゲームがマップエディターから作成されたjsonデータを読み込むと、データの逆シリアル化に失敗し、次のエラーが発生します。
Error getting value from 'mRowCount' on 'LevelData'.
デバッグウィンドウに次のように出力されます。
A first chance exception of type 'System.FieldAccessException' occurred in mscorlib.dll
A first chance exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll
A first chance exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll
この問題は、メンバー変数をプライベートではなくパブリックにすることで解決できます。しかし、Vector2を認識しないと文句を言います。
Error converting value "12, 12" to type 'Microsoft.Xna.Framework.Vector2'. Line 8, position 27.
デバッグウィンドウに次のように出力されます。
A first chance exception of type 'System.Exception' occurred in Newtonsoft.Json.dll
A first chance exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll
マップエディタによって作成されたJsonデータはどこにありますか?
{
"RowCount": 20,
"ColCount": 20,
"NodeSize": 25,
"LevelNodes": [
{
"ID": 1,
"Position": "12, 12",
"Type": 1,
"Neighbours": [
2,
21
]
}
],
"Buildings": []
}
編集:これが私がデータをシリアル化および逆シリアル化する方法です。
String json = Json.ConvertToJson<LevelData>(levelData);
public static class Json
{
// Serialize Object to Json
public static string ConvertToJson<T>(T obj)
{
return JsonConvert.SerializeObject(obj, Formatting.Indented);
}
public static T ConvertFromJson<T>(string json)
{
T result = JsonConvert.DeserializeObject<T>(json);
return result;
}
}
注:マップエディター(.Net)でjsonをシリアル化および逆シリアル化できます。これは、プライベートjsonプロパティとVector2をサポートします。問題は、WindowsPhoneアプリケーションでマップエディターで生成されたjsonデータを逆シリアル化する場合です。