JSON Простой неожиданный персонаж? - PullRequest
2 голосов
/ 13 июля 2020
Unexpected character () at position 0.
    at org.json.simple.parser.Yylex.yylex(Yylex.java:610)
    at org.json.simple.parser.JSONParser.nextToken(JSONParser.java:269)
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:118)
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:81)
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:75)
    at net.ddns.coolpvp.Testing.main(Testing.java:22)

Я создавал TCP-сервер на Java, он получал json и выдавал эту ошибку, но я проверил, и первый символ - '{', как я могу это исправить? Я понятия не имею. Буду очень признателен, если вы мне поможете РЕДАКТИРОВАТЬ: JSON создается. NET Framework в C# приложении, а это JSON

{"Type":"level-info","LevelNumber":1}

Вот как приложение C# генерирует JSON Program.cs

using System;
using System.Text;
using System.Net.Sockets;
using System.IO;

namespace Testing
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            TcpClient client = new TcpClient();
            client.Connect("localhost", 152);
            StreamWriter writer = new StreamWriter(client.GetStream(), Encoding.UTF8) { AutoFlush = true };
            writer.WriteLine(new RequestLevelInfo(1).ToJSONString());
            client.Close();
            Console.ReadKey(true);
        }
    }
}

RequestLevelInfo.cs

using System.Web.Script.Serialization;

namespace Testing
{
    public class RequestLevelInfo
    {
        public string Type { get { return "level-info"; } }
        public int LevelNumber { get; }
        public RequestLevelInfo(int level)
        {
            LevelNumber = level;
        }
        public string ToJSONString()
        {
            return new JavaScriptSerializer().Serialize(this);
        }
    }
}

Сервер читает его, используя BufferedReader, используя метод readLine

package testing;

import java.net.Socket;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Testing {
    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket();
            server.bind(new InetSocketAddress(InetAddress.getByName("localhost"), 152));
            Socket client = server.accept();
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
            String dataReceived = reader.readLine();
            JSONObject json = (JSONObject)new JSONParser().parse(dataReceived);
            System.out.println(json.toJSONString());
            client.close();
            server.close();
        } catch (IOException ex) {
            ex.printStackTrace(System.err);
        } catch (ParseException ex) {
            ex.printStackTrace(System.err);
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Проблема в вашем коде C#: он отправляет неверный JSON.

Вы используете объект Encoding.UTF8. Этот объект включает невидимый и ненужный символ «маркера порядка байтов», который синтаксический анализатор Java JSON не понимает. JSON «не должно» использовать знак отметки порядка байтов: JSON Спецификация и использование BOM / charset-encoding

Решение состоит в том, чтобы создать свой собственный экземпляр UTF8Encoding . Например:

UTF8Encoding jsonEncoding = new UTF8Encoding(false);
StreamWriter writer = new StreamWriter(client.GetStream(), jsonEncoding) { AutoFlush = true };
1 голос
/ 13 июля 2020

Здравствуйте, , я подумал о вашем коде и кое-что изменил, вот мой код:

public static void main(String[] args) {

    try {
        BufferedReader bufferedReader = java.nio.file.Files.newBufferedReader(Paths.get("test.json"));
        JSONObject data = (JSONObject) new JSONParser().parse(bufferedReader);
        System.out.println(data.get("Type"));
    } catch (Exception e) {
        e.printStackTrace();
    }

}

Это содержание теста. json Файл: {"Type":"level-info","LevelNumber":1}

Мой вывод: level-info

Пожалуйста, проверьте, действительно ли импортированы org.json.simple.JSONObject, org.json.simple.parser.JSONParser и org.json.simple.parser.ParseException. Не то чтобы вы случайно импортировали что-то еще.

Удачи, надеюсь, я смогу вам помочь!

РЕДАКТИРОВАТЬ

Итак, у меня произошла ошибка со следующим примером:

public static void main(String[] args) {

    try {
        String string = "{name=Asel, number1=40.34, number2=29.343}";
        JSONObject object = (JSONObject) new JSONParser().parse(string);
        System.out.println(object.get("name"));
    } catch (Exception e) {
        e.printStackTrace();
    }

}

Но не с этим:

public static void main(String[] args) {

    try {
        String string = "{\"name\":\"Asel\", \"number1\":\"40.34\", \"number2\":\"29.343\"}";
        JSONObject object = (JSONObject) new JSONParser().parse(string);
        System.out.println(object.get("name"));
    } catch (Exception e) {
        e.printStackTrace();
    }

}

Поэтому мне интересно, действительно ли ваша строка, которую вы действительно получаете из своего TCP-сокета, точно {"Type":"level-info","LevelNumber":"1"}, а не что-то неверно это: {"Type"="level-info","LevelNumber"="1"}

Чтобы проверить это, вы можете попробовать заменить = на : в строке TP C Socket и посмотреть, возникает ли ошибка по-прежнему.

JSONObject json = (JSONObject) новый JSONParser (). Parse (dataReceived.replace ( "=" , ":" ));

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