Exemplo n.º 1
0
        static JsonArray ParseArray(ReadControl control)
        {
            JsonArray array = new JsonArray();

            JsonElement currentValue = null;
            bool        valueAdded   = false;

            while (control.Read() != ']')
            {
                if (ParserLookup.TryGetValue(control.CurrentCharacter, out Func <ReadControl, JsonElement> parser))
                {
                    currentValue = parser.Invoke(control);
                }
                else
                {
                    switch (control.CurrentCharacter)
                    {
                    case '\0':
                        throw new UnexpectedEndException();

                    case ':':
                        throw new UnexpectedTokenException();

                    case ',':
                        if (!valueAdded)
                        {
                            throw new UnexpectedTokenException();
                        }

                        valueAdded = false;
                        break;

                    default:
                        if (CanParseNumber(control.CurrentCharacter))
                        {
                            currentValue = ParseNumber(control);
                        }
                        break;
                    }
                }

                if (currentValue != null)
                {
                    array.Add(currentValue);

                    currentValue = null;
                    valueAdded   = true;
                }
            }

            return(array);
        }
Exemplo n.º 2
0
        static JsonObject ParseObject(ReadControl control)
        {
            var obj = new JsonObject();

            JsonString  currentKey   = null;
            JsonElement currentValue = null;
            bool        pairAdded    = false;

            while (control.Read() != '}')
            {
                if (ParserLookup.TryGetValue(control.CurrentCharacter, out Func <ReadControl, JsonElement> parser))
                {
                    currentValue = parser.Invoke(control);
                }
                else
                {
                    switch (control.CurrentCharacter)
                    {
                    case '\0':
                        throw new UnexpectedEndException();

                    case ':':
                        if (currentKey == null)
                        {
                            throw new UnexpectedTokenException();
                        }
                        break;

                    case ',':
                        if (!pairAdded)
                        {
                            throw new UnexpectedTokenException();
                        }

                        pairAdded = false;
                        break;

                    default:
                        if (CanParseNumber(control.CurrentCharacter))
                        {
                            currentValue = ParseNumber(control);
                        }
                        break;
                    }
                }

                if (currentValue != null)
                {
                    if (currentKey == null)
                    {
                        currentKey = currentValue as JsonString ?? throw new InvalidKeyException();
                    }
                    else
                    {
                        if (obj.ContainsKey(currentKey))
                        {
                            switch (control.Options.DuplicateKeyBehaviour)
                            {
                            case DuplicateKeyBehaviour.Overwrite:
                                obj[currentKey] = currentValue;
                                break;

                            case DuplicateKeyBehaviour.Ignore:
                                // We do nothing, as the value for the key will remain unchanged.
                                break;

                            case DuplicateKeyBehaviour.ThrowException:
                            default:
                                throw new DuplicateKeyException(currentKey);
                            }
                        }
                        else
                        {
                            obj.Add(currentKey, currentValue);
                        }

                        currentKey = null;
                        pairAdded  = true;
                    }

                    currentValue = null;
                }
            }

            return(obj);
        }
 public void SetUp()
 {
     _subject = new ParserLookup();
 }