Programm [JAVA!]Minecraft Chat JSON zu String

Dieses Thema im Forum "Programmierung" wurde erstellt von mastercake10, 1. Januar 2014.

  1. mastercake10
    Offline

    mastercake10

    Registriert seit:
    3. Januar 2013
    Beiträge:
    14
    Hallo,
    Habe gerade ein problem. Ich möchte gerne die JSON vom Minecraft Chat zu einem String umwandeln und alle unnötigen
    Charakter entfernen(like / ; { ; } ; :) so dass die Nachricht lesbar ist.

    Ein Beispiel einer JSON - Chat nachricht auf einem Server:
    Und diese will ich entwa so haben:

    Weiß einer, wie ich dies erziele?
     
    #1
  2. Paulomart
    Offline

    Paulomart

    Registriert seit:
    3. November 2013
    Beiträge:
    148
    Ort:
    C:/Eclipse/Workspace/
    Minecraft:
    Paulomart
    Schonmal darüber nachgedacht ein decoder zuschreiben oder einen vorhandenen zuverwenden?
     
    #2
  3. mastercake10
    Offline

    mastercake10

    Registriert seit:
    3. Januar 2013
    Beiträge:
    14
    Ja, das habe ich bereits. Habe schon einen Decoder (json-simple) ausprobiert, aber er funktioniert nicht für diese art von Jsons..
     
    #3
  4. Taces
    Offline

    Taces

    Registriert seit:
    17. Oktober 2013
    Beiträge:
    16
    Das ganze folgt ja immer einem bestimmten Muster, es sollte also nicht so schwer sein enen Parser dafür zu schreiben ;)
    Zum Beispiel hast du ja immer "text" o.ä. vor dem, was du rausfiltern willst.
     
    #4
  5. mastercake10
    Offline

    mastercake10

    Registriert seit:
    3. Januar 2013
    Beiträge:
    14
    @Taces

    Aber wie soll ich die color- und formating-codes raus filtern? Mit replaceAll usw.?
     
    #5
  6. Paulomart
    Offline

    Paulomart

    Registriert seit:
    3. November 2013
    Beiträge:
    148
    Ort:
    C:/Eclipse/Workspace/
    Minecraft:
    Paulomart
    Wofür brauchst du das eigentlich?... Vielleicht geht das ganze auch einfacher
     
    #6
  7. mastercake10
    Offline

    mastercake10

    Registriert seit:
    3. Januar 2013
    Beiträge:
    14
    Ich möchten den Chat einfach in einer Textarea angezeigt haben, so wie er auch in Minecraft ist. Die Messages erhalte ich mit der McProtocolLib.
     
    #7
  8. Taces
    Offline

    Taces

    Registriert seit:
    17. Oktober 2013
    Beiträge:
    16
    Das müsstest du gar nicht ^^
    Du könntest deinen String z.B. bei jedem
    text\":\"
    splitten, dann hast du en String Array mit deinem Text und noch einigen Format-Angaben, du weißt aber schon einmal, dass er erste Teil jedes Array-Elements das ist, was du suchst. Ebenfalls weißt du, dass dieser Text mit einem \" aufhört. Also splittest du jedes Array-Element noch einmal bei \" und der erste Teil davon ist dann dein gesuchter Text ;) Das ganze Dann zusammensetzen und schon hast du es :)

    /e
    So könnte das ganze aussehen:

    Code (Text):
    1. public String parseJSON(String json){
    2.         String result="";
    3.         for(String s1:json.split("text\\\":\\\"")){
    4.             result+=s1.split("\\\"")[0];
    5.         }
    6.         return result;
    7.     }
    Dreifaches \ deswegen, weil du mit dem ersten \ das zweite \ escapest und mit dem dritten \ das ". Ist eine Sache von RegEx und ab und an ein wenig komplex ^^
     
    #8
  9. Chrisliebaer
    Online

    Chrisliebaer

    Wie wärs einfach das JSON mit nem normalen JSON Parser zu parsen und alle "text" Elemente aneinander zufügen? Das sollte wunderbar mit simple-json laufen.
     
    #9
  10. mastercake10
    Offline

    mastercake10

    Registriert seit:
    3. Januar 2013
    Beiträge:
    14

    Danke für die vorschläge. Ich habe den text bei jeden Komma gesplittet und hier das Schema:

    Dann habe ich es so ähnlich wie Taces gemacht und versucht den Text rauszufiltern:



    Bei der ersten nachricht Funktioniert es, ich bekomme sie auch fast wie in Minecraft (Abgesehn von ein paar eckigen klammern)
    Aber bei der zweiten bekomme ich einen Error...
    Hier die nachrichten in Json's:
    [{"text":""}
    {"text":"You are globally warned on glizer "
    "bold":false
    "italic":false
    "underlined":false
    "strikethrough":false
    "obfuscated":false
    "color":"gold"}
    {"text":"(-10)"
    "bold":false
    "italic":false
    "underlined":false
    "strikethrough":false
    "obfuscated":false
    "color":"yellow"}]
    [{"text":""}
    {"text":"[G] "
    "bold":false
    "italic":false
    "underlined":false
    "strikethrough":false
    "obfuscated":false
    "color":"gray"}
    {"text":""
    "bold":false
    "italic":false
    "underlined":false
    "strikethrough":false
    "obfuscated":false
    "color":"white"}
    {"text":"[Premium] "
    "bold":false
    "italic":false
    "underlined":false
    "strikethrough":false
    "obfuscated":false
    "color":"dark_green"}
    {"text":"Username1023"
    "bold":false
    "italic":false
    "underlined":false
    "strikethrough":false
    "obfuscated":false
    "color":"aqua"}
    {"text":"?"
    "bold":false
    "italic":false
    "underlined":false
    "strikethrough":false
    "obfuscated":false
    "color":"gold"}
    {"text":": bin off bb:D"
    "bold":false
    "italic":false
    "underlined":false
    "strikethrough":false
    "obfuscated":false
    "color":"gray"}]
    [{"text":""}

    Disconnected: Internal exception: io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(1) + length(4) exceeds writerIndex(4): UnpooledHeapByteBuf(ridx: 1, widx: 4, cap: 4)
    io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(1) + length(4) exceeds writerIndex(4): UnpooledHeapByteBuf(ridx: 1, widx: 4, cap: 4)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:258)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:140)
    at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:317)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:154)
    at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:317)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:154)
    at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:317)
    at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHandler.java:148)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:317)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:794)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.IndexOutOfBoundsException: readerIndex(1) + length(4) exceeds writerIndex(4): UnpooledHeapByteBuf(ridx: 1, widx: 4, cap: 4)
    at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1161)
    at io.netty.buffer.AbstractByteBuf.readInt(AbstractByteBuf.java:612)
    at ch.spacebase.packetlib.tcp.io.ByteBufNetInput.readInt(ByteBufNetInput.java:52)
    at ch.spacebase.mc.protocol.packet.ingame.server.entity.ServerAnimationPacket.read(ServerAnimationPacket.java:32)
    at ch.spacebase.packetlib.tcp.TcpPacketCodec.decode(TcpPacketCodec.java:36)
    at io.netty.handler.codec.ByteToMessageCodec$1.decode(ByteToMessageCodec.java:42)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:227)
    ... 26 more

    Habt ihr eine Lösung?
     
    #10
  11. Taces
    Offline

    Taces

    Registriert seit:
    17. Oktober 2013
    Beiträge:
    16
    Bei welchem der beiden geht es denn und bei welchem nicht?
    Laut der Fehlermeldung hast du ja eine IndexOutOfBoundsException, allerdings lässt sich ohne den Code und entsprechende Zeilenangaben nicht nachvollziehen, woher er genau kommt.
     
    #11