Как десериализовать JSON в список, используя SIMPLE JSON? - PullRequest
1 голос
/ 19 октября 2019

У меня есть следующий JSON.

[{"SaveValues": [{"id": 1, "allposition": {"x": - 4.888263702392578, "y": 4.799035549163818}, "allrotation": { "х": 0.0, "у": 0.0, "г": 0,0, "ш": 1,0}, "allscale": { "х": 1,0, "у": 1,0},»linepos0 ": {" х ": 0,0," у ": 0.0," Z ": 0,0}," linepos1 ": {" х ": 0.0," у ": 0.0," г ": 0,0}," movetype»: 1}, { "идентификатор": 2, "allposition": { "х": - 4,607616424560547, "у": - 4,033360004425049}, "allrotation": { "х": 0.0, "у": 0,0, "г": 0.0," ш ": 1,0}," allscale ": {" х ": 1,0," у ": 1,0}," linepos0 ": {" х ": 0.0," у ": 0.0," г ":0,0}, "linepos1": { "х": 0.0, "у": 0.0, "г": 0,0}, "movetype": 1}], "NoteValues": [{ "movenumber": 1, "notemsg": "SSD"}]}, { "SaveValues": [{ "ID": 1, "allposition": { "х": - 4,888263702392578, "у": 4,799035549163818}, "allrotation": { "х": 0.0, "у": 0.0, "г": 0,0, "ш": 1,0}, "allscale": { "х": 1,0, "у": 1,0}, "linepos0": { "х": 0.0,»у ": 0.0," г ": 0,0}," linepos1 ": {" х ": 0.0," у ": 0.0," г ": 0,0}," movetype ": 2}, {" идентификатор ": 2,"allposition": { "х": - 4,607616424560547, "у": - 4,033360004425049}, "allrotation": { "х": 0.0, "у": 0.0, "г": 0,0, "ш": 1,0},"allscale": { "х": 1,0, "у": 1,0}, "linepos0": { "х": 00,0, "у": 0.0, "г": 0,0}, "linepos1": { "х": 0.0, "у": 0.0, "г": 0,0}, "movetype": 2}, { "идентификатор": 2," allposition ": {" х ": 4,328777313232422," у ": 1,9337825775146485}," allrotation ": {" х ": 0.0," у ": 0.0," г ": 0.0," ш ": 1,0}, "allscale": { "х": 1,0, "у": 1,0}, "linepos0": { "х": 0.0, "у": 0.0, "г": 0,0}, "linepos1": {»х ": 0.0," у ": 0.0," г ": 0,0}," movetype ": 2}]," NoteValues ​​": [{" movenumber ": 2," notemsg ":" DDF "}]}]

Класс, используемый для сериализации, приведен ниже.

[System.Serializable]
public class PlayerHandler 
{
    public int id; 
    public Vector2 allposition;
    public Quaternion allrotation;
    public Vector2 allscale;

    public Vector3 linepos0;
    public Vector3 linepos1;
    public int movetype;

    public PlayerHandler(int ids,Vector2 allpos,Quaternion allrot,Vector2 allscal,Vector3 Line0,Vector3 Line1,int Moves)
    {
        this.id = ids;
        this.allposition = allpos;
        this.allrotation = allrot;
        this.allscale = allscal;
        this.linepos0 = Line0;
        this.linepos1 = Line1;
        this.movetype = Moves;
    }

}

[System.Serializable]    
public class PlayerMovement
{
    public int movenumber;
    public string notemsg;

    public PlayerMovement(int Movenum,string Note)
    {
        this.movenumber = Movenum;
        this.notemsg = Note;    
    }
}

В методе загрузки я пытаюсь десериализовать JSON. Поэтому я создал список List<PlayerHandler> SaveValuesDeserialize = new List<PlayerHandler>();

Я хочу добавить SaveValues ​​из Json. Метод, который я пробовал, приведен ниже.

using (FileStream fs = new FileStream(Application.persistentDataPath + "/" + filename, FileMode.Open))
{
    fs.Dispose();
    jsonLoadstring = File.ReadAllText(Path.Combine(Application.persistentDataPath, filename));
    JSONNode JNode = SimpleJSON.JSON.Parse(jsonLoadstring);                

    var deseiralized = JNode[0]["NoteValues"][0]["notemsg"];//Here I am getting the deserialized value for testing.

    //What should I do to get the SaveValues inside the list

    for (int i = 0; i < JNode.Count; i++)
    {
        SaveValuesDeserialize.Add(JNode[i]["SaveValues"][i]);
    }
}

Я ищу решение этой проблемы с помощью SIMPLE JSON. Я пытался использовать другие методы для десериализациичто было немного сложно понять. Выберите этот метод, чтобы попробовать. Так как я получаю тестовые значения, я надеюсь, что смогу получить значения с помощью SIMPLEJSON.

Ответы [ 2 ]

3 голосов
/ 19 октября 2019

Самый простой способ десериализации json - это часто создавать классы, которые моделируют ваш объект json. Вы можете использовать json2csharp для создания классов или использовать Visual Studio (Правка -> Специальная вставка -> Вставить JSON как классы).

Создайте классы ниже, затем вы можете использовать JsonConvert для десериализации json в ваш объект. Обратите внимание, что поскольку вас интересует только SaveValues, вам не нужно отображать другие свойства (например, NoteValues).

Код для десериализации в объект:

var myModel = JsonConvert.DeserializeJson<List<Response>>(json);

// access by iterating through properties
foreach (var item in response)
{
    foreach (var saveValue in item.SaveValues)
    {
        // get all properties of saveValue...
        // saveValue.Allposition;
        // saveValue.Allrotation;
        // saveValue.Allscale;
        // ....
    }
}

Thisдесериализует JSON до List<Response>, где Response, как показано ниже:

public class Allposition
{
    public double x { get; set; }
    public double y { get; set; }
}

public class Allrotation
{
    public double x { get; set; }
    public double y { get; set; }
    public double z { get; set; }
    public double w { get; set; }
}

public class Allscale
{
    public double x { get; set; }
    public double y { get; set; }
}

public class Linepos0
{
    public double x { get; set; }
    public double y { get; set; }
    public double z { get; set; }
}

public class Linepos1
{
    public double x { get; set; }
    public double y { get; set; }
    public double z { get; set; }
}

public class SaveValue
{
    public int Id { get; set; }
    public Allposition Allposition { get; set; }
    public Allrotation Allrotation { get; set; }
    public Allscale Allscale { get; set; }
    public Linepos0 Linepos0 { get; set; }
    public Linepos1 Linepos1 { get; set; }
    public int Movetype { get; set; }
}

public class Response
{
    public List<SaveValue> SaveValues { get; set; }
    // NoteValues can safely be removed from model if you don't need the values
    public List<NoteValue> NoteValues { get; set; }
}

// optional
public class NoteValue
{
    public int Movenumber { get; set; }
    public string Notemsg { get; set; }
}
0 голосов
/ 25 октября 2019

Спасибо за ответ haldo. Я не пробовал ваше решение, но попробовал следующее, и оно сработало для меня. Я внес некоторые изменения в класс для сериализации данных, чтобы я мог использовать его для десериализации.

public class ListContainer
{

public List<PlayerHandler> SaveValues;
public List<PlayerMovement> NoteValues;


public ListContainer(List<PlayerHandler> _saveVal, List<PlayerMovement> _noteVal)
{
    SaveValues = _saveVal;
    NoteValues = _noteVal;

}

}


[System.Serializable]
public class PlayerHandler 
{
public int id; 
public Vector2 allposition;
public Quaternion allrotation;
public Vector2 allscale;

public Vector3 linepos0;
public Vector3 linepos1;
public int movetype;


public PlayerHandler(int ids,Vector2 allpos,Quaternion allrot,Vector2 allscal,Vector3 Line0,Vector3 Line1,int Moves)

{
    this.id = ids;
    this.allposition = allpos;
    this.allrotation = allrot;
    this.allscale = allscal;
    this.linepos0 = Line0;
    this.linepos1 = Line1;
    this.movetype = Moves;
}


}

[System.Serializable]
public class PlayerMovement
{
public int movenumber;
public string notemsg;

public PlayerMovement(int Movenum,string Note)
{
    this.movenumber = Movenum;
    this.notemsg = Note;

}

}


//Added to retrieve data
[System.Serializable]
public class RootObject
{
    public PlayerHandler[] SaveValues;
    public PlayerMovement[] NoteValues;

    }

//Added to retrieve data
[System.Serializable]
public class RootObjects
{


 public RootObject[] Roots;
}

Я внес несколько изменений в способ извлечения данных.

using (FileStream fs = new FileStream(Application.persistentDataPath + "/" + filename, FileMode.Open))
{


fs.Dispose();


jsonLoadstring = File.ReadAllText(Path.Combine(Application.persistentDataPath, filename));


string saveString = "{ \"Roots\" : " + jsonLoadstring + "}";

GetItems = JsonUtility.FromJson<RootObjects>(saveString);
//Loop GetItems to retrieve data.

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...