Home > Blockchain >  How do I get info from an object with an array of objects in a json for Unity?
How do I get info from an object with an array of objects in a json for Unity?

Time:10-26

I have a JSON file setup as such

{
  "cards": [
    {
      "id": "sand_bags",
      "type": "Structure",
      "name": "Sand Bags",
      "values": [
        {
          "civilian": 1,
          "fiend": -1
        }
      ],
      "effectTexts": [
        {
          "civilian": "Add  1 to your BUNKER.",
          "fiend": "Send any CIVILIAN'S  1 STRUCTURE to the SCRAPYARD."
        }
      ],
      "flavorTexts": [
        {
          "civilian": "They're just heavy bags with sand. Not much else to say, but they'll slow down an attack from a fiend. Good luck, you'll need it!",
          "fiend": "You've spotted a pretty bad STRUCTURE in this BUNKER. Time to do some damage."
        }
      ],
      "staysOnField": [
        {
          "civilian": true,
          "fiend": false
        }
      ],
      "amountInDeck": 5
    }
  ]
}

I also have a Cards script

[Serializable]
public class Cards
{
    public Card[] cards;
}

[Serializable]
public class Card
{
    public string id;
    public string type;
    public string name;

    public int amountInDeck;
}

public class Values
{
    public int civilian;
    public int fiend;
}

I then have a CardEffects script that I'm using for my functions.

public class CardEffects : MonoBehaviour
{
    public TextAsset jsonFile;

    public Values values;

    void Start()
    {
        Cards cardsInJson = JsonUtility.FromJson<Cards>(jsonFile.text);

        foreach (Card card in cardsInJson.cards)
        {
            Debug.Log("Card name: "   card.name   " with "   values.civilian   " in the deck.");
        }
    }
}

I have searched all over trying to figure out how to even get the array of objects of "values". I got this far and the value printed is always 0 regardless of the information in "values" in the JSON. If I make the class Serializable, I'm able to change the values and it works but I want the values to be whatever they were declared as in the JSON. Is there a better way to do this?

Please keep in mind I'm new to C# and Unity. I usually code in JS in which using JSON files are no big deal for me and thought it was the best way to go.

CodePudding user response:

I suggest MiniJson. You can just copy paste the script to your project and you are ready to go. The then can call Json.Deserialize(string json) passing your string in. For the case of an array you can do for example:

IList myJsonElements = (IList)Json.Deserialize(string json);

CodePudding user response:

Your json and your classes doesn't match. Not only that your json isn't even valid Json. Below I will give you your correct json and class.

{
  "cards": [
    {
      "id": "sand_bags",
      "type": "Structure",
      "name": "Sand Bags",
      "values": [
        {
          "civilian": 1,
          "fiend": -1
        }
      ],
      "effectTexts": [
        {
          "civilian": "Add  1 to your BUNKER.",
          "fiend": "Send any CIVILIAN'S  1 STRUCTURE to the SCRAPYARD."
        }
      ],
      "flavorTexts": [
        {
          "civilian": "They're just heavy bags with sand. Not much else to say, but they'll slow down an attack from a fiend. Good luck, you'll need it!",
          "fiend": "You've spotted a pretty bad STRUCTURE in this BUNKER. Time to do some damage."
        }
      ],
      "staysOnField": [
        {
          "civilian": true,
          "fiend": false
        }
      ],
      "amountInDeck": 5
    }
  ] // <---- This was missing
}

For that Json this is how your card class will have to look like:

public Card 
{
    public string id { get; set; }
    public string type { get; set; }
    public string name { get; set; }
    public Values[] values { get; set; }
    public Values[] effectTexts { get; set; }
    public Values[] staysOnField { get; set; }
    public int amountInDeck { get; set; }
}

And your Values class have to look like this:

public class Values
{
    public object civilian;
    public object fiend;
}
  • Related