Q:

Why it's not playing all the conversations and not in the right order from start to end?

For testing I have two conversations at index 0 and 1.
And I want it to play the first conversation index 0 and then when it finish playing it to start playing the next conversation at index 1.
This is the script with the playing methods. The first should play a list/array of conversations one by one the second should play only a single conversation :
PlayConversations and PlayConversation.
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;

public class ConversationTrigger : MonoBehaviour
{
    public List<Conversation> conversations = new List<Conversation>();
    public static List<int> conversationsToPlay = new List<int>();
    public bool conversationEnd;
    public GameObject canvas;
    public static int conversationIndex;

    private DialogueManager dialoguemanager;
    private string jsonPath;

    public void InitJsonPath()
    {
        jsonPath = Application.persistentDataPath + "/" + "Json.txt";
    }

    private void Start()
    {
        conversationIndex = 0;
        dialoguemanager = FindObjectOfType<DialogueManager>();
    }

    public IEnumerator PlayConversations()
    {
        canvas.SetActive(true);
        conversationEnd = false;
        var conversations = conversationsToPlay.ToArray(); // Copy the list
        conversationsToPlay.Clear(); // Immediately clear the original list

        for (int i = 0; i < conversations.Length; i++) // iterate over the array
        {
            // Now you also don't need to remove items anymore, 
            // since you already cleared the list
            yield return StartCoroutine(PlayConversation(conversations[i]));
        }
    }

    public IEnumerator PlayConversation(int index)
    {
        if (conversations.Count > 0 &&
            conversations[index].Dialogues.Count > 0)
        {
            for (int i = 0; i < conversations[index].Dialogues.Count; i++)
            {
                if (dialoguemanager != null)
                {
                    dialoguemanager.StartDialogue(conversations[index].Dialogues[i]);
                }

                while (DialogueManager.dialogueEnded == false)
                {
                    yield return null;
                }
            }

            conversationEnd = true;
            conversationIndex = index;
            canvas.SetActive(false);
            Debug.Log("Conversation Ended");
        }
    }

    public void SaveConversations()
    {
        string jsonTransform = JsonHelper.ToJson(conversations.ToArray(), true);
        File.WriteAllText(jsonPath, jsonTransform);
    }

    public void LoadConversations()
    {
        string jsonTransform = File.ReadAllText(jsonPath);
        conversations.Clear();
        conversations.AddRange(JsonHelper.FromJson<Conversation>(jsonTransform));
    }
}

For that I made another helper script :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayConversations : MonoBehaviour
{
    private static ConversationTrigger conversationTrigger;
    private static PlayConversations instance;

    private void Awake()
    {
        conversationTrigger = GetComponent<ConversationTrigger>();
        instance = this;
    }

    public static void ConversationToPlay(int index)
    {
        ConversationTrigger.conversationsToPlay.Add(index);
        instance.StartCoroutine(conversationTrigger.PlayConversations());
    }
}

And a script for testing :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BeginningCutscene : MonoBehaviour
{
    public DepthOfField dephOfField;

    // Update is called once per frame
    void Update()
    {
        if (dephOfField.dephOfFieldFinished == true)
        {
            PlayConversations.ConversationToPlay(0);
            PlayConversations.ConversationToPlay(1);
        }
    }
}

But it's start playing first the conversation at index 1 then only part of conversation at index 0 and then start over again then ending.

A:

I think your issue has to do with the way you implemented the ConversationsToPlay method. At each call of the method you start a new coroutine which in turn will call the  PlayConversation method. What this means is that each call of ConversationToPlay will play the conversation at the index you passed and that is why they are overlapping.
The simplest solution I can think of is to move the start of the coroutine outside of the ConversationsToPlay method.
Something like this:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayConversations : MonoBehaviour
{
    private static ConversationTrigger conversationTrigger;
    private static PlayConversations instance;

    private void Awake()
    {
        conversationTrigger = GetComponent<ConversationTrigger>();
        instance = this;
    }

    public static void AddConversationToPlay(int index)
    {
        ConversationTrigger.conversationsToPlay.Add(index);
    }

    public static void StartPlayConversationsCoroutine()
    {
        instance.StartCoroutine(conversationTrigger.PlayConversations());
    }
}

and the test script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BeginningCutscene : MonoBehaviour
{
    public DepthOfField dephOfField;

    // Update is called once per frame
    void Update()
    {
        if (dephOfField.dephOfFieldFinished == true)
        {
            PlayConversations.AddConversationToPlay(0);
            PlayConversations.AddConversationToPlay(1);
            PlayConversations.StartPlayConversationsCoroutine();
        }
    }
}

